一.TCP/UDP Sockets
1.TCP需要四个方面的数据:
本地iP,本地应用程序使用的TCP端口,远程IP地址,远程系统响应TCP端口
2.TCP客户端和服务器端操作步骤:
(1)客户端:建立客户端socket连接==》得到socket的读写流==》操作数据流==》关闭数据流==》关闭socket
(2)服务器端:建立一个服务器端并开始监听==》使用accept方法获取新的连接==》建立输入输出流==》在已有回话的协议上产生回话==》关闭客户端数据流和socket==》关闭服务器socket
注意:BIO 方式使得整个处理过程和连接是绑定的,只要连接建立,无论客户端是否有消息发送,都要进行等待处理,一定程度上浪费了服务器端的硬件资源.
NIO 方式的支持是通过Channel 和Selector 方式来实现,采用的方法为向Channel注册感兴趣的事件,然后通过Selector 来获取到发生了事件的key,如发生了相应的事件,则进行相应的处理,否则则不做任何处.所以NIO效率比BIO效率高
例子:
客户端: public static void main(String[] args) throws Exception{
//1.建立与服务器端的连接
String host="127.0.0.1";
int port=9527;
Socket socket=new Socket(host,port);
//2.读取服务器端返回的流。
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//3.获取输出流,从而将数据输出到指定地 址和端口的服务器。
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
BufferedReader systemIn=new BufferedReader(new InputStreamReader(System.in));
boolean flag=true;
while(flag)
{
String command=systemIn.readLine();
if(command==null ||
"quit".equalsIgnoreCase(command.trim())){
flag=false;
System.out.println("Client quit!");
out.println("quit");
out.close();
in.close();
socket.close();
continue;
}
out.println(command);
String response=in.readLine();
System.out.println(response);
}
}
服务端:public static void main(String[] args) throws Exception{
//1.指定服务器端口建立监听
int port=9527;
ServerSocket ss=new ServerSocket(port);
System.out.println("Server listen on port: "+port);
//2.ss.accept() 阻塞式的等待客户端的连接,当有客户
//端的连接请求进入时,此方法才返回Socket 对象
Socket socket=ss.accept();
//3.获取接收的消息流,进行处理
BufferedReader in=new BufferedReader(new
InputStreamReader(socket.getInputStream()));
//4.获取输出流对象,从而写入数据返回给客户端。
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
while(true)
{
//声明写入变量
String line=in.readLine();
if(line==null)
{
Thread.sleep(100);
continue;
}
if("quit".equalsIgnoreCase(line.trim()))
{
in.close();
out.close();
ss.close();
System.out.println("Server has been shutdown!");
System.exit(0);
}
else{
System.out.println("Message from client: "+ line);
out.println("Server response:"+line);
Thread.sleep(100);
}
}
}
(3)一些关键类的理解
InetAddress类:表示一个Internet主机地址
Socket类:实现客户端的socket
ServerSocket类:实现服务器的socket,等待从网络到达的请求,基于这些请求完成操作,返回相应的结果给请求者。
3.UDP发送端和接收端操作步骤:
(1)UDP发送端:初始化DatagramSocket 对象==>初始化DatagramPacket 对象,并绑定此数据所需发送的目标地址==>通过DatagramSocket 发送DatagramPacket 对象到指定的目标地址。
(2)UDP接收端:初始化DatagramSocket 对象,并指定在某个端口上监听数据==》初始化DatagramPacket 对象,并指定所需接收的数据的大小==》//3.从监听的端口上获取所收到的数据
例子:
发送端:public static void main(String[] args) throws Exception{
int port=9527;
int aport=9528;
//1.初始化DatagramSocket 对象
DatagramSocket serverSocket=new DatagramSocket(aport);
//2.初始化DatagramPacket 对象,并绑定此数据所需发送的目标地址
byte[] buffer=new byte[65507];
DatagramPacket receivePacket=new DatagramPacket(buffer,buffer.length);
//3.声明发送DatagramPacket
DatagramSocket socket=new DatagramSocket();
//获取本地服务器名
InetAddress server=InetAddress.getByName("localhost");
BufferedReader systemIn=new BufferedReader(new InputStreamReader(System.in));
boolean flag=true;
while(flag)
{
String command=systemIn.readLine();
//通过DatagramSocket 发送DatagramPacket 对象到指定的目标地址。
byte[] datas=command.getBytes("UTF-8");
DatagramPacket packet=new DatagramPacket(datas,datas.length,server,port);
socket.send(packet);
if(command==null ||"quit".equalsIgnoreCase(command.trim()))
{
flag=false;
System.out.println("Client quit!");
socket.close();
continue;
}
serverSocket.receive(receivePacket);
String receiveResponse=new
String(receivePacket.getData(),0,receivePacket.getLength(),"UTF-8");
System.out.println(receiveResponse);
}
}
接收端:public static void main(String[] args) throws Exception{
int port=9527;
int aport=9528;
//1.初始化DatagramSocket 对象,并指定在某个端口上监听数据。
DatagramSocket server=new DatagramSocket(port);
DatagramSocket client=new DatagramSocket();
//获取本地服务器名
InetAddress serverAddress=InetAddress.getByName("localhost");
//2.初始化DatagramPacket 对象,并指定所需接收的数据的大小。
byte[] buffer=new byte[65507];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
while(true)
{
//3.从监听的端口上获取所收到的数据。
server.receive(packet);
String line=new
String(packet.getData(),0,packet.getLength(),"UTF-8");
if("quit".equalsIgnoreCase(line.trim()))
{
server.close();
System.exit(0);
}else
{
System.out.println("Message from client: "+ line);
packet.setLength(buffer.length);
String response="Server response:"+line;
byte[] datas=response.getBytes("UTF-8");
DatagramPacket responsePacket=new DatagramPacket(datas,datas.length,serverAddress,aport);
client.send(responsePacket);
Thread.sleep(100);
}
}
}
4.TCP和UDP的区别:
(1)TCP/IP是一种可靠的网络数据传输协议,UDP/IP是一种不保证数据一定到达的网络传输协议。
(2)TCP/IP没有UDP/IP性能好。
在网络IO操作上有3中方式:BIO,NIO,AIO;java只支持前两种。
JAVA网络通讯总结一
猜你喜欢
转载自youkaohasang.iteye.com/blog/1838903
今日推荐
周排行