赞
踩
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通信。
首先先来看下ServerSocket
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
服务器套接字的实际工作由 SocketImpl
类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
一些重要的方法:(具体大家查看官方api吧)
ServerSocket(int port, int backlog)
利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
bind(SocketAddress endpoint, int backlog)
将 ServerSocket
绑定到特定地址(IP 地址和端口号)。
accept()
侦听并接受到此套接字的连接
getInetAddress()
返回此服务器套接字的本地地址。
close()
关闭此套接字。
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
套接字的实际工作由 SocketImpl
类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
一些重要的方法:(具体大家查看官方api吧)
Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
getInetAddress()
返回套接字连接的地址。
shutdownInput()
此套接字的输入流置于“流的末尾”。
shutdownOutput()
禁用此套接字的输出流。
close()
关闭此套接字。
以上转自https://blog.csdn.net/OscarNile/article/details/78578285
(1)客户端:
(2)服务端:
- 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();
-
- //发送方
- 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();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。