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 }