Socket通信,TCP/UDP

 

  •  TCP与UDP的区别:

TCP:
建立在连接的基础上;
是安全性更高;
传输速度低;
适合传输数据量大的数据

UDP:
建立在非连接的基础上;
安全性低;
传输速度高;
数据量小的数据

客户端:(app,浏览器)
服务器端:不等于主机

  •  端口号

同一台主机上每一个服务器都拥有自己的端口号,取值范围:0~65535

  •  常用的端口:80,8080
  •  注意点:
  1. 要保证客户端和服务器端的端口号一致
  2. 要保证同一台主机上的不同服务器端口号不同

UDP

注意点:在工作时,应该先将服务端运行起来,处于一个监听的状态,再运行客户端


  •  客户端:
  1. 创建UDP通信的对象:socket对象---对应的类是DatagramSocket(用于UDP的接收和发送)
DatagramSocket datagramSocket = new DatagramSocket();
  1. 数据的准备---封装包:DatagramPacket(数据包,包括相关的属性,数据)
/**
	 * 打包
	 * 第一个参数:包的内容
	 * 第二个参数:数据的长度
	 * 第三个参数:主机对象
	 * 第四个参数:端口号
	 */
	byte[] buf = "bingbing".getBytes();
	DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 521);
  1. 发送数据,通过send方法
datagramSocket.send(packet);
  1. 关闭socket对象
datagramSocket.close();
  •  服务器端

1.创建socket对象,并绑定端口号

DatagramSocket socket = new DatagramSocket(521);
  1. 创建包对象,创建空数组,准备接收传来的数据
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();
  •  服务器端:
  1. 创建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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值