网络编程
UDP
- UDP协议是一种不可靠的网络协议,在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于UDP协议而言,通信双方没有所谓的客户端和服务器的概念。
- Java提供了DatagramSocket类作为基于UDP协议的Socket
UPD通信程序练习
发送端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26/**
* UDP发送数据
* 数据来自键盘录入,直到输入的数据是886,发送数据结束
*/
public class SendDemo2 {
public static void main(String[] args) throws IOException {
//创建发送端的Socket对象(DatagramSocket)
DatagramSocket ds=new DatagramSocket();
//自己封装键盘录入数据
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line=br.readLine())!=null){
if("886".equals(line)){
break;
}
//创建数据打包
// new DatagramPacket(数据的字节数组, 字节数组长度, ip地址, 端口号);
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 12345);
//发送数据
ds.send(dp);
}
//关闭发送端
ds.close();
}
}接收端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20/**
* UPD接收数据
* 因为接收端不知道发送端什么时候停止,故采用死循环
*/
public class ReceiveDemo2 {
public static void main(String[] args) throws IOException{
//创建接收端的Socket对象(DatagramSocket)
DatagramSocket ds=new DatagramSocket(12345);
//因为接收端不知道发送端什么时候停止,故采用死循环
while (true) {
//创建数据包,用于接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//接收数据
ds.receive(dp);
//解析数据,将数据打印在控制台上
System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
}
}
}
TCP
- TCP协议是一种可靠的网络协议,在通信的两端各建立一个Socket对象,从而在通信两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。
- Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信
- Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
TCP通信程序练习
客户端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24/**
* 客户端: 数据来自键盘录入,直到输入的是886,发送数据结束
*/
public class ClientDemo {
public static void main(String[] args) throws IOException {
//创建客户端的Socket对象(Socket)
Socket s = new Socket("127.0.0.1", 12345);
//数据来自键盘录入,直到输入的是886,发送数据结束
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//封装输出流对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while ((line = br.readLine()) != null) {
if("886".equals(line)){
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
s.close();
}
}
服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19/**
* 服务器: 接收到的数据在控制台输出
*/
public class SeverDemo {
public static void main(String[] args) throws IOException {
//创建服务器端的Socket对象(ServerSocket)
ServerSocket ss = new ServerSocket(12345);
//监听客户端连接,返回一个Socket对象
Socket s = ss.accept();
//封装获取的输入流对象,读数据,打印在控制台
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//释放资源
ss.close();
}
}