当前位置:   article > 正文

TCP/UDP编程简记_datagramsocket = new datagramsocket

datagramsocket = new datagramsocket

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
  1. TCP客户端
  2. //1、创建socket对象
  3. Socket client = new Socket("localhost",8888);
  4. //2.创建缓冲字符流
  5. BufferedIReader br = new BufferedReader(new InputStreamReader(System.in));
  6. String str = br.readLine();
  7. //3.创建输出流
  8. PrintWriter pw = new PrintWriter(client.getOutputStream(),true);
  9. pw.println(str);
  10. pw.flush();
  11. client.shutDownOutput();
  12. //4.客户端从socket中读取信息
  13. BufferReader br2 = new BufferReader(new InputStreamReader(client.getInputStream(),"gdk"));
  14. System.out.println(br2.readLine());
  15. client.shutDownInput();
  16. br2.close();
  17. pw.close();
  18. br.close();
  19. client.close();
  1. TCP服务器端
  2. //接收
  3. ServerSocket server = new ServerSocket(8888);
  4. Socket client = server.accept();
  5. BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream());
  6. system.out.println(client.getInetAddress().getHostName()+"说:"+br.readLine();
  7. client.shutdownInput();
  8. //发送
  9. PrintWriter pw = new PrintWriter(client.getOutputStream(),true);
  10. pw.println("ok,get it");
  11. pw.flush();
  12. client.shutdowmOutput();
  13. pw.close();
  14. br.close();
  15. client.close();

5、基于UDP的socket 编程

  1. //发送方
  2. Scanner input = new Scanner(System.in);
  3. //1创建DatagramSocket对象 用于发送或者接受数据包
  4. DatagramSocket ds = new DatagramSocket(9000);//9000是自己端口,这个端口号可以不指定,系统随机分配一个没有被使用用的端口号
  5. while(true){
  6. //2、创建数据包 发送数据
  7. String str = input.next();//9000端口 发送到8000端口
  8. //发送数据 字节数组
  9. DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("127.0.0.1"),8000);
  10. //3、发送
  11. ds.send(dp);
  12. if("bye".equals(str)){
  13. break;
  14. }
  15. /*现在发送方变成接收方*/
  16. byte[] buf = new byte[1024];
  17. //3/创建数据包对象 接受数据
  18. DatagramPacket dp1 = new DatagramPacket(buf,buf.length);
  19. ds.receive(dp1);
  20. //4、显示一下接受的信息
  21. System.out.println(new String(dp1.getData(),0,dp1.getLength()));
  22. }
  23. //关闭
  24. ds.close();
  1. //接收方
  2. Scanner input = new Scanner(System.in);
  3. //1、DatagramSocket对象
  4. DatagramSocket ds = new DatagramSocket(8000);
  5. while(true){
  6. //2、接受数据包
  7. byte[] buf = new byte[1024];
  8. //3/创建数据包对象 接受数据
  9. DatagramPacket dp = new DatagramPacket(buf,buf.length);
  10. ds.receive(dp);
  11. //4、显示一下接受的信息
  12. String s = new String(dp.getData(),0,dp.getLength());
  13. System.out.println(s);
  14. if("bye".equals(s)){
  15. break;
  16. }
  17. /* 现在接收方就变成发送方*/
  18. String str = input.next();//8000端口 发送到9000端口
  19. //发送数据 字节数组
  20. DatagramPacket dp1 = new DatagramPacket(str.getBytes(),str.getBytes().length,dp.getAddress(),dp.getPort());
  21. //3、发送
  22. ds.send(dp1);
  23. }
  24. //关闭
  25. ds.close();

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/146800
推荐阅读
相关标签
  

闽ICP备14008679号