- TCP与UDP的区别:
TCP:
建立在连接的基础上;
是安全性更高;
传输速度低;
适合传输数据量大的数据
UDP:
建立在非连接的基础上;
安全性低;
传输速度高;
数据量小的数据
客户端:(app,浏览器)
服务器端:不等于主机
- 端口号
同一台主机上每一个服务器都拥有自己的端口号,取值范围:0~65535
- 常用的端口:80,8080
- 注意点:
- 要保证客户端和服务器端的端口号一致
- 要保证同一台主机上的不同服务器端口号不同
UDP
注意点:在工作时,应该先将服务端运行起来,处于一个监听的状态,再运行客户端
- 客户端:
- 创建UDP通信的对象:socket对象---对应的类是DatagramSocket(用于UDP的接收和发送)
DatagramSocket datagramSocket = new DatagramSocket();
- 数据的准备---封装包:DatagramPacket(数据包,包括相关的属性,数据)
/**
* 打包
* 第一个参数:包的内容
* 第二个参数:数据的长度
* 第三个参数:主机对象
* 第四个参数:端口号
*/
byte[] buf = "bingbing".getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 521);
- 发送数据,通过send方法
datagramSocket.send(packet);
- 关闭socket对象
datagramSocket.close();
- 服务器端
1.创建socket对象,并绑定端口号
DatagramSocket socket = new DatagramSocket(521);
- 创建包对象,创建空数组,准备接收传来的数据
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
3.接收数据---当服务器运行起来,这个方法会一直处于监听状态
socket.receive(packet);
//将数据从包中取出
byte[] bs = packet.getData();
System.out.println(new String(bs));//打印接收到的数据
4.关闭相关的对象
socket.close();
实例:实现随时发送随时接收
客户端:
DatagramSocket socket = new DatagramSocket();
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
String date = null;
while((date = bReader.readLine())!=null) {
DatagramPacket packet = new DatagramPacket(date.getBytes(), date.getBytes().length,InetAddress.getLocalHost(),1234);
socket.send(packet);
String string = new String(packet.getData()).trim();
if (string.equals("over")) {
break;
}
}
socket.close();
服务器端:
DatagramSocket socket = new DatagramSocket(1234);
while(true) {
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String string = new String(packet.getData()).trim();
System.out.println(string);
if (string.equals("over")) {
break;
}
}
socket.close();
TCP
在客户端与服务器端通信的时候,对于客户端既要进行传入又要进行输出.所以在Socket内部就内置了输入流和输出流,当进行数据传输的时候,将数据放入Socket对象的内部,将Socket对象传到服务器端,相当于客户端和服务器端之间建立了一条通道,两端使用同一个Socket对象
- 客户端:
1.创建Socket对象,并绑定服务器的地址和端口
Socket socket = new Socket(InetAddress.getLocalHost(), 526);
2.准备数据
String date = "BigData1812,你好";
3.获取socket内部的输出流
OutputStream o = socket.getOutputStream();
4.将数据写入网络
o.write(date.getBytes());
5.从服务器端传回的数据
InputStream inputStream = socket.getInputStream();
byte[] ar = new byte[1024];
int num = inputStream.read(ar);
System.out.println(new String(ar, 0, num));
5.关闭流
socket.close();
- 服务器端:
- 创建ServerSocket对象并绑定端口
ServerSocket serverSocket = new ServerSocket(526);
2.接收套接字的连接,保证客户端和服务器端使用的是同一个socket对象---一直处于监听状态
Socket socket = serverSocket.accept();
3.获取输入流
InputStream inputStream = socket.getInputStream();
4.将内容写到控制台
byte[] ar = new byte[1024];
int num = inputStream.read(ar);
System.out.println(new String(ar, 0, num));
5.实现将服务器的数据写回客户端
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好".getBytes());
6.关闭相应的对象
socket.close();
使用字符流实现客户端和服务器的TCP通信
- 客户端
获取socket对象,并绑定接口,IP
Socket socket = new Socket(InetAddress.getLocalHost(),121);
获取输入源,将控制台作为输入源
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
获取输入流,输出到网络
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream,true);//当后面的参数是true时,会自动执行刷新,只有执行print,println时会执行
接收服务器传来的数据
InputStream inputStream = socket.getInputStream();
BufferedReader brReader1 = new BufferedReader(new InputStreamReader(inputStream));
将输入流传输到网络
String date = null;
while((date = bReader.readLine())!=null) {
printWriter.println(date);
//接收服务器端传送的内容,并将其打印在控制台
//如果是over结束循环
if ("over".equals(date)) {
break;
}
String getDate = brReader1.readLine();
System.out.println(""+getDate);
}
关闭流
bReader.close();
brReader1.close();
printWriter.close();
socket.close();
- 服务器端
获取ServerSocket对象
ServerSocket serverSocket = new ServerSocket(121);
使用套接字的连接保证客户端和服务器端使用的是同一个socket
Socket socket = serverSocket.accept();
获取输入流
InputStream inputStream = socket.getInputStream();
BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream));
获取输出流
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
读取数据,并将所想要的数据返回用户端
String date = null;
while((date = bReader.readLine())!=null) {
//获取输出流,将输入数据的大写字符传送到客户端
//System.out.println(date.toUpperCase());
printWriter.println("输出结果--->:"+date.toUpperCase());
//判断如果是over结束
if ("over".equals(date)) {
break;
}
}
关闭流
bReader.close();
printWriter.close();
serverSocket.close();