프로그래밍/C# C#소켓 1:1채팅 서버 곰환 2017. 4. 13. 16:10 using System; using System; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.IO; namespace server { public partial class Form1 : Form { public class Network { public Socket sock; public byte[] buffer; public Int32 size; public Network(Int32 buffersize) { this.size = buffersize; this.buffer = new byte[size]; } public void inibuffer() { this.buffer = null; this.buffer = new byte[size]; } } private Socket serverSocket; private AsyncCallback acbReceiveH; private AsyncCallback acbSendH; private AsyncCallback acbAcceptH; private FileStream fsRecv = null; private int flag = 0; private byte[] readB = new byte[3072]; public delegate void SetProgCallBack(int vv); public delegate void SetLabelCallBack(string str); NetworkStream stream = default(NetworkStream); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { IPAddress ipaddress = Dns.Resolve(Dns.GetHostName()).AddressList[0]; ServIPtextBox.Text = Convert.ToString(ipaddress); Porttextbox.Text = ""; } #region [서버오픈 버튼] private void Openbutton_Click(object sender, EventArgs e) { try { flag = 1; acbReceiveH = new AsyncCallback(handleDataReceive); acbSendH = new AsyncCallback(handleDataSend); acbAcceptH = new AsyncCallback(handleConnectionRequest); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(IPAddress.Parse(ServIPtextBox.Text), Convert.ToInt32(Porttextbox.Text))); serverSocket.Listen(5); serverSocket.BeginAccept(acbAcceptH, null); } catch (Exception e1) { MessageBox.Show(e1.Message); } } #endregion #region [메세지 전송 버튼] private void Sendbutton_Click(object sender, EventArgs e) { Network ao = new Network(1); ao.buffer = Encoding.UTF8.GetBytes(SendtextBox.Text); //SendtextBox.Text = ""; ao.sock = serverSocket; serverSocket.BeginSend(ao.buffer, 0, ao.buffer.Length, SocketFlags.None, acbSendH, ao); } #endregion public void handleDataReceive(IAsyncResult ar) { Network ao = (Network)ar.AsyncState; Int32 recvBytes = ao.sock.EndReceive(ar); if (recvBytes > 0) ChattextBox.AppendText(Encoding.UTF8.GetString(ao.buffer)); ChattextBox.AppendText("\r\n"); if (fsRecv == null) { fsRecv = new FileStream("download", FileMode.Create, FileAccess.ReadWrite); } fsRecv.Write(ao.buffer, 0, ao.buffer.Length); ao.inibuffer(); ao.sock.BeginReceive(ao.buffer, 0, ao.buffer.Length, SocketFlags.None, acbReceiveH, ao); } public void handleDataSend(IAsyncResult ar) { Network ao = (Network)ar.AsyncState; Int32 sentbyte = ao.sock.EndSend(ar); if (sentbyte > 0) { ChattextBox.AppendText(Encoding.UTF8.GetString(ao.buffer) + "\r\n"); } } private void handleConnectionRequest(IAsyncResult ar) { serverSocket = serverSocket.EndAccept(ar); Network ao = new Network(100); ao.sock = serverSocket; serverSocket.BeginReceive(ao.buffer, 0, ao.buffer.Length, SocketFlags.None, acbReceiveH, ao); } } }