tcp连接建立以后,就可以基于这个连接通道来发送和接受消息了,TCP、UDP都是在基于Socket概念上为某类应用场景而扩展出的传输协议,那么什么是socket呢?socket是一种抽象层,应用程序通过它来发送和接收数据,就像应用程序打开一个文件句柄,把数据读写到磁盘上一样。
使用socket可以把应用程序添加到网络中,并与处于同一个网络中的其他应用程序进行通信。不同类型的Socket与不同类型的底层协议簇有关联。主要的socket类型为流套接字(stream socket)和数据报文套接字(datagram socket)。
stream socket把TCP作为端对端协议(底层使用IP协议),提供一个可信赖的字节流服务。
数据报文套接字(datagram socket)使用UDP协议(底层同样使用IP协议)提供了一种“尽力而为”的数据报文服务。
基于TCP协议实现通信
简单的从客户端发送一个消息到服务端的功能
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TT {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=null;
BufferedReader in=null;
/**
* TCP 的服务端要先监听一个端口,一般是先调用bind 函数,给这个Socket 赋予一个IP 地址和端口。为什么需要端口呢?要知道,你写的是一个应用程序,
* 当一个网络包来的时候,内核要通过TCP 头里面的这个端口,来找到你这个应用程序,把包给你。
* 为什么要IP 地址呢?有时候,一台机器会有多个网卡,也就会有多个IP 地址,你可以选择监听所有的网卡,也可以选择监听一个网卡,
* 这样,只有发给这个网卡的包,才会给你。
*/
try{
serverSocket=new ServerSocket(8080);
//阻塞等待客户端连接接下来,服务端调用accept 函数,拿出一个已经完成的连接进行处理。如果还没有完成,就要等着。
Socket socket=serverSocket.accept();
//连接建立成功之后,双方开始通过read 和write 函数来读写数据,就像往一个文件流里面写东西一样。
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
}catch (Exception e){
e.printStackTrace();
}finally {
if(in!=null){
try{
in.close();
}catch (Exception e){
e.printStackTrace();
}
}
if(serverSocket!=null){
serverSocket.close();
}
}
}
}
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class TT2 {
public static void main(String[] args) {
Socket socket = null;
PrintWriter out = null;
try{
socket = new Socket("127.0.0.1",8080);
out = new PrintWriter(socket.getOutputStream(),true);
out.println("hello,word");
}catch (Exception e){
e.printStackTrace();
}finally {
if(out!=null){
out.close();
}
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
基于TCP实现双向通信对话功能
TCP是一个全双工协议,数据通信允许数据同时在两个方向上传输,因此全双工是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。我们来做一个简
单的实现
Server端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TT3 {
public static void main(String[] args) {
try{
//-->>创建一个8080的端口在客户端的请求
ServerSocket serverSocket = null;
serverSocket = new ServerSocket(8080);
//使用accept()阻塞等待客户的请求,有客户端的请求,则产生一个Socoket对象,并继续执行
Socket socket = serverSocket.accept();
String line = "";
//由Socket对象得到输入流,并构造相应的BUfferReader对象
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//socker对象得到输出流,并构造PrintWriter对象
PrintWriter os = new PrintWriter(socket.getOutputStream());
//由系统标准输入设备构造BufferReader对象
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
System.out.println(is.readLine());
line = sin.readLine();
while (!line.equals("byebye")){
os.println(line);
os.flush();
System.out.println("server:"+line);
System.out.println("client:"+is.readLine());
line = sin.readLine();
}
os.close();
is.close();
socket.close();
serverSocket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
Client端
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TT4 {
public static void main(String[] args) {
try{
Socket socket = new Socket("127.0.0.1",8080);
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
PrintWriter os = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line="";
line = sin.readLine();
while(!line.equals("ByeBye")){
os.println(line);
os.flush();
System.out.println("client:"+line);
System.out.println("sever:"+is.readLine());
line = sin.readLine();
}
os.close();
is.close();
socket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}