TCP
是专门设计用于在不可靠的因特网上提供可靠的,端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流。
UDP
UDP想应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接。是一种不可靠的连接。
Socket
两个JAVA应用程序通过一个双向的网络通信连接实现数据交换,这个双向链路的一段成为一个Socket。
Socket通常用来实现client--server连接
java.net包中定义的两个类Socket和ServerSocket,分别用来实现双相连接的client和server端
建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port number)
TCP端口和UDP端口是分开的,各自拥有65535个端口。
Socket的通信过程
1.创建通讯双方的Socket连接,即分别为服务器和客户端创建Socket对象,建立Socket连接。
2.打开连接到的Socket的输入流和输出流。
3.按照一定的协议对Socket进行读写操作。
4.读写操作结束后,关闭Socket连接。
TCP 通信模型
服务器端:
1.调用ServerSocket对象的accept方法侦听接受客户端的连接请求。
2.创建与Socket对象绑定的输入输出流,并建立相应的数据输入输出流。
3.通过数据输入输出流与客户端进行数据读写,完成双向通信。
4.当客户端断开连接时,关闭各个流对象。
客户端:
1.创建指定服务器上指定端口号的Socket对象。
2.创建与Socket对象绑定的输入输出流,并建立相应的数据输入输出流。
3.通过数据输入输出流与服务器进行数据读写,完成双向通信。
4.关闭与服务器的连接,关闭各个流对象,结束通信。
一个简单的例子
MyServer.java
import java.io.*;
import java.net.*;
public class MyServer{
public static void main(String[] args){
try{
String s;
//在端口2005注册服务
ServerSocket server = new ServerSocket(2005);
System.out.println("等待与客户端连接!");
Socket socket = server.accept();//阻塞式侦听连接请求,等待连接
System.out.println("与客户端连接成功!");
//获得对应的Socket的输入输出流
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
//建立数据流
DataInputStream din = new DataInputStream(in);
DataOutputStream dout = new DataOutputStream(out);
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
while(true){
s = din.readUTF();//读入从client传来的字符串
System.out.println("从客户端接受的消息是:" + s);
if(s.equals("bye")){
System.out.println("成功退出服务端!");
break;
}
System.out.println("请输入要发送的信息:");
s = sin.readLine();//读取用户输入的字符串
dout.writeUTF(s);//将读取的字符串传给client
if (s.equals("bye")){
System.out.println("成功退出服务端!");
break;
}
}
//关闭连接
din.close();
dout.close();
in.close();
out.close();
socket.close();
}catch(Exception e){
System.out.println("Error:" + e);
}
}
}
MyClient.java
import java.io.*;
import java.net.*;
public class MyClient{
public static void main(String[] args){
try{
String s;
//端口号应与服务器端口号一致
Socket socket = new Socket("127.0.0.1", 2005);
System.out.println("与服务器连接成功!");
//获得对应socket的输入输出流
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
//建立数据流
DataInputStream din = new DataInputStream(in);
DataOutputStream dout = new DataOutputStream(out);
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));//阻塞式的等待显示器的输入
while (true){
System.out.println("请输入要发送的信息(输入 bye 退出):");
s = sin.readLine();//读取用户输入的字符串
dout.writeUTF(s);//将读取的字符串传给server
if (s.equals("bye")){
System.out.println("成功退出客户端!");
break;
}
s = din.readUTF();//从服务器获得字符串
if (s.equals("bye")){
System.out.println("成功退出客户端!");
break;
}
System.out.println("从服务端接受的消息是:" + s);
}
//关闭连接
din.close();
dout.close();
in.close();
socket.close();
}catch (Exception e)
{
System.out.println(e);
}
}
}
运行结果图:
欢迎光临我师傅小锋哥的网站 Java知识分享网 www.java1234.com 有大量Java资料供学习参考用,一切免费