TCP/UDP编程简记

Java为Socket编程封装了几个重要的类。

1.1 Socket类

Socket类实现了一个客户端socket,作为两台机器通信的终端,默认采用的传输层协议为TCP,是一个可靠传输的协议。Socket类除了构造函数返回一个socket外,还提供了connect, getOutputStream, getInputStream和close方法。connect方法用于请求一个socket连接,getOutputStream用于获得写socket的输出流,getInputStream用于获得读socket的输入流,close方法用于关闭一个流。

1.2 DatagramSocket类

DatagramSocket类实现了一个发送和接收数据报的socket,传输层协议使用UDP,不能保证数据报的可靠传输。DataGramSocket主要有send, receive和close三个方法。send用于发送一个数据报,Java提供了DatagramPacket对象用来表达一个数据报。receive用于接收一个数据报,调用该方法后,一直阻塞接收到直到数据报或者超时。close是关闭一个socket。

1.3 ServerSocket类

ServerSocket类实现了一个服务器socket,一个服务器socket等待客户端网络请求,然后基于这些请求执行操作,并返回给请求者一个结果。ServerSocket提供了bind、accept和close三个方法。bind方法为ServerSocket绑定一个IP地址和端口,并开始监听该端口。accept方法为ServerSocket接受请求并返回一个Socket对象,accept方法调用后,将一直阻塞直到有请求到达。close方法关闭一个ServerSocket对象。

1.4 SocketAddress

SocketAddress提供了一个socket地址,不关心传输层协议。这是一个虚类,由子类来具体实现功能、绑定传输协议。它提供了一个不可变的对象,被socket用来绑定、连接或者返回数值。

1.5 InetSocketAddress

InetSocketAddress实现了IP地址的SocketAddress,也就是有IP地址和端口号表达Socket地址。如果不制定具体的IP地址和端口号,那么IP地址默认为本机地址,端口号随机选择一个。

1.6. DatagramPacket

DatagramSocket是面向数据报socket通信的一个可选通道。数据报通道不是对网络数据报socket通信的完全抽象。socket通信的控制由DatagramSocket对象实现。DatagramPacket需要与DatagramSocket配合使用才能完成基于数据报的socket通信。

2、相关联的API:

首先先来看下ServerSocket

类 ServerSocket 

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。 

一些重要的方法:(具体大家查看官方api吧)

ServerSocket(int port, int backlog) 
利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。

bind(SocketAddress endpoint, int backlog) 
将 ServerSocket 绑定到特定地址(IP 地址和端口号)。

accept() 
侦听并接受到此套接字的连接

getInetAddress() 
返回此服务器套接字的本地地址。

 close() 
关闭此套接字。

3.再来看下Socket

类 Socket  

此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。

一些重要的方法:(具体大家查看官方api吧)

Socket(InetAddress address, int port) 
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

getInetAddress() 
返回套接字连接的地址。

shutdownInput() 
此套接字的输入流置于“流的末尾”。

shutdownOutput() 
禁用此套接字的输出流。

close() 
关闭此套接字。

以上转自https://blog.csdn.net/OscarNile/article/details/78578285

4、基于TCP的socket编程

(1)客户端:

  • 建立连接
  • 打开socket关联的输入输出流
  • 数据流中读写信息
  • 关闭所有数据流和socket

(2)服务端:

  • 建立连接,处理发送到指定端口的数据
  • 获取客户端对象
  • 数据流中读写信息
  • 关闭所有数据流和socket
TCP客户端

//1、创建socket对象

Socket client = new Socket("localhost",8888);

//2.创建缓冲字符流

BufferedIReader br = new BufferedReader(new InputStreamReader(System.in));

String str = br.readLine();

//3.创建输出流
PrintWriter pw = new PrintWriter(client.getOutputStream(),true);

pw.println(str);
pw.flush();
client.shutDownOutput();

//4.客户端从socket中读取信息

BufferReader br2 = new BufferReader(new              InputStreamReader(client.getInputStream(),"gdk"));

System.out.println(br2.readLine());
client.shutDownInput();

br2.close();
pw.close();
br.close();
client.close();
 
TCP服务器端

//接收

ServerSocket server = new ServerSocket(8888);

Socket client = server.accept();

BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream());

system.out.println(client.getInetAddress().getHostName()+"说:"+br.readLine();

client.shutdownInput();



//发送
PrintWriter pw = new PrintWriter(client.getOutputStream(),true);
pw.println("ok,get it");

pw.flush();

client.shutdowmOutput();

pw.close();
br.close();
client.close();

5、基于UDP的socket 编程

//发送方
Scanner input = new Scanner(System.in);
		//1创建DatagramSocket对象 用于发送或者接受数据包

		DatagramSocket ds = new DatagramSocket(9000);//9000是自己端口,这个端口号可以不指定,系统随机分配一个没有被使用用的端口号
		
		while(true){
			//2、创建数据包 发送数据
			String str = input.next();//从9000端口 发送到8000端口

			//发送数据  字节数组
			DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("127.0.0.1"),8000);
			//3、发送
			ds.send(dp);
			if("bye".equals(str)){
				break;
			}
			
			/*现在发送方变成接收方*/
			byte[] buf = new byte[1024];

			//3/创建数据包对象 接受数据
			DatagramPacket dp1 = new DatagramPacket(buf,buf.length);

			ds.receive(dp1);
			//4、显示一下接受的信息

			System.out.println(new String(dp1.getData(),0,dp1.getLength()));

			
		}
		
		//关闭
		ds.close();
//接收方

Scanner input = new Scanner(System.in);
		
		//1、DatagramSocket对象

		DatagramSocket ds = new DatagramSocket(8000);
		while(true){
			//2、接受数据包
			byte[] buf = new byte[1024];
			//3/创建数据包对象 接受数据
			DatagramPacket dp = new DatagramPacket(buf,buf.length);
			ds.receive(dp);
			//4、显示一下接受的信息
			
			String s = new String(dp.getData(),0,dp.getLength());
			System.out.println(s);
			if("bye".equals(s)){
				break;
			}
			
			
			
			/*    现在接收方就变成发送方*/
			String str = input.next();//从8000端口 发送到9000端口
			//发送数据  字节数组
			DatagramPacket dp1 = new DatagramPacket(str.getBytes(),str.getBytes().length,dp.getAddress(),dp.getPort());
			//3、发送
			ds.send(dp1);
			
			
		}
		
		//关闭
		ds.close();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皓月星辰_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值