Socket网络编程
客户端
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.IO; 7 using System.Linq; 8 using System.Net; 9 using System.Net.Sockets; 10 using System.Text; 11 using System.Threading; 12 using System.Threading.Tasks; 13 using System.Windows.Forms; 14 15 namespace Practice_客户端 16 { 17 public partial class Form1 : Form 18 { 19 public Form1() 20 { 21 InitializeComponent(); 22 } 23 Socket socketSend; 24 private void button1_Click(object sender, EventArgs e) 25 { 26 //创建负责通信的socket 27 socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 28 //拿到负责通信的端口号和地址 29 IPAddress ip = IPAddress.Parse(txtServer.Text); 30 IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text)); 31 socketSend.Connect(point); 32 ShowMsg("连接成功"); 33 Thread td = new Thread(Receive); 34 td.IsBackground = true; 35 td.Start(socketSend); 36 } 37 void ShowMsg(string str) 38 { 39 txtLog.AppendText(str + "\r\n"); 40 } 41 ///42 /// 客户端给服务器发送消息 43 /// 44 /// 45 /// 46 private void button2_Click(object sender, EventArgs e) 47 { 48 string str = txtMsg.Text.Trim(); 49 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str); 50 socketSend.Send(buffer); 51 txtMsg.Clear(); 52 } 53 void Receive(object o) 54 { 55 socketSend = o as Socket; 56 while (true) 57 { 58 //连接成功后,服务器端应接受客户端发来的消息 59 byte[] buffer = new byte[1024 * 1024 * 3]; 60 int r = socketSend.Receive(buffer); 61 if (r == 0) 62 { 63 break; 64 } 65 //根据发送过来的字节数组第一位,判断表示发送的是文字消息 66 if (buffer[0] == 0) 67 { 68 string str = Encoding.UTF8.GetString(buffer, 1, r - 1); 69 ShowMsg(socketSend.RemoteEndPoint + ":" + str); 70 } 71 else if (buffer[0] == 1) 72 { 73 SaveFileDialog sfd = new SaveFileDialog(); 74 sfd.InitialDirectory = @"C:\Users\杰殇\Desktop"; 75 sfd.Title = "请选择要保存的文件"; 76 sfd.Filter = "所有文件|*.*"; 77 sfd.ShowDialog(this); 78 string path = sfd.FileName; 79 using (FileStream fsWriter = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)) 80 { 81 fsWriter.Write(buffer,1,r-1); 82 } 83 MessageBox.Show("保存成功"); 84 } 85 else if (buffer[0] == 2) 86 { 87 ZD(); 88 } 89 90 91 } 92 } 93 /// 94 /// 震动 95 /// 96 void ZD() 97 { 98 for (int i = 0; i < 500; i++) 99 { 100 this.Location = new Point(200, 200); 101 this.Location = new Point(280, 280); 102 } 103 } 104 105 106 private void Form1_Load(object sender, EventArgs e) 107 { 108 Control.CheckForIllegalCrossThreadCalls = false; 109 } 110 } 111 }
服务器端
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.IO; 7 using System.Linq; 8 using System.Net; 9 using System.Net.Sockets; 10 using System.Text; 11 using System.Threading; 12 using System.Threading.Tasks; 13 using System.Windows.Forms; 14 15 namespace Practice____服务器端 16 { 17 public partial class Form1 : Form 18 { 19 public Form1() 20 { 21 InitializeComponent(); 22 } 23 Socket socketSend; 24 //将远程连接过来的客户端的IP地址和Socket存入集合中 25 Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>(); 26 private void button1_Click(object sender, EventArgs e) 27 { 28 //创建负责监听的Socket 29 Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 30 //创建IP地址和端口号对象 31 IPAddress ip = IPAddress.Any; 32 IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text)); 33 //让负责通信的socket绑定ip和端口号 34 socketWatch.Bind(point); 35 ShowMsg("连接成功"); 36 //设置监听队列 37 socketWatch.Listen(10); 38 /*//等待客户端连接并创建负责通信的socket 39 Socket socketSend= socketWatch.Accept(); 40 ShowMsg(socketSend.RemoteEndPoint.ToString());*/ 41 Thread td = new Thread(Listen); 42 td.IsBackground = true; 43 td.Start(socketWatch); 44 45 } 46 47 void Listen(object o) 48 { 49 Socket socketWatch = o as Socket; 50 while (true) 51 { 52 //等待客户端连接并创建负责通信的socket 53 Socket socketSend = socketWatch.Accept(); 54 //将远程连接过来的客户端的IP地址和Socket存入集合中 55 dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend); 56 //将远程连接过来的客户端的IP地址和端口号放入下拉框中 57 cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString()); 58 ShowMsg(socketSend.RemoteEndPoint.ToString()); 59 /* //连接成功后,服务器端应接受客户端发来的消息 60 byte[] buffer = new byte[1024 * 1024 * 3]; 61 int r = socketSend.Receive(buffer); 62 string str = Encoding.UTF8.GetString(buffer,0,r); 63 ShowMsg(socketSend.RemoteEndPoint + ":" + str);*/ 64 Thread td = new Thread(Receive); 65 td.IsBackground = true; 66 td.Start(socketSend); 67 } 68 } 69 ///70 /// 服务器端不停接收从客户端发来的消息 71 /// 72 void Receive(object o) 73 { 74 socketSend = o as Socket; 75 while (true) 76 { 77 //连接成功后,服务器端应接受客户端发来的消息 78 byte[] buffer = new byte[1024 * 1024 * 3]; 79 int r = socketSend.Receive(buffer); 80 if (r == 0) 81 { 82 break; 83 } 84 string str = Encoding.UTF8.GetString(buffer, 0, r); 85 ShowMsg(socketSend.RemoteEndPoint + ":" + str); 86 87 } 88 } 89 void ShowMsg(string str) 90 { 91 txtLog.AppendText(str + "\r\n"); 92 } 93 94 private void Form1_Load(object sender, EventArgs e) 95 { 96 Control.CheckForIllegalCrossThreadCalls = false; 97 } 98 /// 99 /// 给客户端发送消息 100 /// 101 /// 102 /// 103 private void button2_Click(object sender, EventArgs e) 104 { 105 string str = txtMsg.Text.Trim(); 106 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str); 107 List<byte> list = new List<byte>(); 108 list.Add(0); 109 list.AddRange(buffer); 110 //将泛型集合转化为数组 111 byte[] newbuffer= list.ToArray(); 112 //socketSend.Send(buffer); 113 //获得用户在下拉框中选中的ip地址 114 string ip = cboUsers.SelectedItem.ToString(); 115 dicSocket[ip].Send(newbuffer); 116 txtMsg.Clear(); 117 } 118 /// 119 /// 选择要发送的文件 120 /// 121 /// 122 /// 123 private void btnSelect_Click(object sender, EventArgs e) 124 { 125 OpenFileDialog ofd = new OpenFileDialog(); 126 ofd.InitialDirectory=@"C:\Users\杰殇\Desktop"; 127 ofd.Title = "请选择您要发送的文件"; 128 ofd.Filter = "所有文件|*.*"; 129 ofd.ShowDialog(); 130 txtPath.Text = ofd.FileName; 131 } 132 133 private void button4_Click(object sender, EventArgs e) 134 { 135 //获得要发送文件的路径 136 string path = txtPath.Text; 137 using(FileStream fsRead=new FileStream(path, FileMode.Open, FileAccess.Read)) 138 { 139 byte[] buffer = new byte[1024 * 1024 * 5]; 140 int r = fsRead.Read(buffer, 0, buffer.Length); 141 List<byte> list = new List<byte>(); 142 list.Add(1); 143 list.AddRange(buffer); 144 byte[] newbuffer = list.ToArray(); 145 dicSocket[cboUsers.SelectedItem.ToString()].Send(newbuffer, 0, r+1,SocketFlags.None); 146 147 } 148 } 149 150 private void btnZD_Click(object sender, EventArgs e) 151 { 152 byte[] buffer = new byte[1]; 153 buffer[0] = 2; 154 dicSocket[cboUsers.SelectedItem.ToString()].Send(buffer); 155 } 156 } 157 }