import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class Test { public static void main(String[] args) { //TCP协议进行通信的两个应用进程,客户端,服务端,使用TCP协议前,需要建立TCP链接,形成基于字节流的传输数据通道,传输前采用三次握手的方式,点对点通信,是可靠的 //TCP协议采用重发机制,当一个通信实体发送信息到另一个时,需要双方确认,如果没确认成功,则会再次发送,在连接中可进行大数据量的传输,传输完毕需要释放已建立的链接,效率低 //UDP协议进行通信的两个应用进程:发送端,接受端,将数据,源,目的封装成数据包,不需要建立链接,不管对方是否准备好,接收方不确认,不能保证数据的完整性,是不靠谱的,每个报文大小限制在64K内 //发送结束时无需释放资源,开销小,通信效率高,适用音频视频,普通数据传输 //TCP三次握手,客户端向服务端发起连接请求,发送SYN报文,发送序号为X,服务端发送SYN+ACK报文确认客户端的请求,发送序号为Y,确认序号为X+1,客户端发送ACK报文确认收到服务端请求,发送序号为Z,确认序号为Y+1 //TCP四次挥手,客户端向服务器端发起结束链接,让服务器做好最后的准备工作,此时客户端半关闭,表示不再向服务器发送数据了,但是还可以接受数据,第二次挥手,服务器收到客户端的请求后,会将最后的数据发给客户端,告知上层不再接受数据 //第三次挥手,服务器发完数据后释放连接报文发到客户端,第四次挥手,客户端收到释放连接报文,回复一个断开报文,服务器收到后彻底断开链接 int port = 8989; Thread thread = new Thread(new Runnable() { @Override public void run() { Socket socket = null; OutputStream outputStream = null; try { InetAddress inetAddress = InetAddress.getByName("127.0.0.1"); socket = new Socket(inetAddress,port); outputStream = socket.getOutputStream(); System.out.println("客户端已启动"); outputStream.write("你好,请多多关照".getBytes()); } catch (UnknownHostException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } finally { try { if(socket != null) { socket.close(); } if(outputStream != null) { outputStream.close(); } } catch (IOException e) { throw new RuntimeException(e); } } } }); ServerSocket serverSocket = null; Socket socket = null; InputStream inputStream = null; try { serverSocket = new ServerSocket(port); thread.start(); socket = serverSocket.accept(); System.out.println("访问者IP是" + socket.getInetAddress().getHostAddress()); System.out.println("服务端已开启"); inputStream = socket.getInputStream(); byte[] bytes = new byte[10240]; int len; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); while((len = inputStream.read(bytes)) != -1) { //可能出现乱码 String string = new String(bytes,0,len); System.out.println(string); //正确的 byteArrayOutputStream.write(bytes,0,len); } System.out.println(byteArrayOutputStream.toString()); } catch (IOException e) { throw new RuntimeException(e); } finally { try { if(serverSocket != null) { serverSocket.close(); } if(socket != null) { socket.close(); } if(inputStream != null) { inputStream.close(); } } catch (IOException e) { throw new RuntimeException(e); } } } }
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class Test
{
public static void main(String[] args)
{
//TCP协议进行通信的两个应用进程,客户端,服务端,使用TCP协议前,需要建立TCP链接,形成基于字节流的传输数据通道,传输前采用三次握手的方式,点对点通信,是可靠的
//TCP协议采用重发机制,当一个通信实体发送信息到另一个时,需要双方确认,如果没确认成功,则会再次发送,在连接中可进行大数据量的传输,传输完毕需要释放已建立的链接,效率低
//UDP协议进行通信的两个应用进程:发送端,接受端,将数据,源,目的封装成数据包,不需要建立链接,不管对方是否准备好,接收方不确认,不能保证数据的完整性,是不靠谱的,每个报文大小限制在64K内
//发送结束时无需释放资源,开销小,通信效率高,适用音频视频,普通数据传输
//TCP三次握手,客户端向服务端发起连接请求,发送SYN报文,发送序号为X,服务端发送SYN+ACK报文确认客户端的请求,发送序号为Y,确认序号为X+1,客户端发送ACK报文确认收到服务端请求,发送序号为Z,确认序号为Y+1
//TCP四次挥手,客户端向服务器端发起结束链接,让服务器做好最后的准备工作,此时客户端半关闭,表示不再向服务器发送数据了,但是还可以接受数据,第二次挥手,服务器收到客户端的请求后,会将最后的数据发给客户端,告知上层不再接受数据
//第三次挥手,服务器发完数据后释放连接报文发到客户端,第四次挥手,客户端收到释放连接报文,回复一个断开报文,服务器收到后彻底断开链接
int port = 8989;
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
Socket socket = null;
OutputStream outputStream = null;
try
{
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
socket = new Socket(inetAddress,port);
outputStream = socket.getOutputStream();
System.out.println("客户端已启动");
outputStream.write("你好,请多多关照".getBytes());
}
catch (UnknownHostException e)
{
throw new RuntimeException(e);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
finally
{
try
{
if(socket != null)
{
socket.close();
}
if(outputStream != null)
{
outputStream.close();
}
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
}
});
ServerSocket serverSocket = null;
Socket socket = null;
InputStream inputStream = null;
try
{
serverSocket = new ServerSocket(port);
thread.start();
socket = serverSocket.accept();
System.out.println("访问者IP是" + socket.getInetAddress().getHostAddress());
System.out.println("服务端已开启");
inputStream = socket.getInputStream();
byte[] bytes = new byte[10240];
int len;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
while((len = inputStream.read(bytes)) != -1)
{
//可能出现乱码
String string = new String(bytes,0,len);
System.out.println(string);
//正确的
byteArrayOutputStream.write(bytes,0,len);
}
System.out.println(byteArrayOutputStream.toString());
}
catch (IOException e)
{
throw new RuntimeException(e);
}
finally
{
try
{
if(serverSocket != null)
{
serverSocket.close();
}
if(socket != null)
{
socket.close();
}
if(inputStream != null)
{
inputStream.close();
}
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
}
}
计算机网络技术与JAVA网络编程利用TCP建立服务端和客户端-----计算机网络经典
于 2023-07-18 16:44:07 首次发布