(注:新手没有学过太多基础知识,以下内容可能会有很多不成熟甚至错误的内容,还请大佬们多多指教)
基础知识一:TCP通信协议原理
TCP:传输控制协议 (Transmission Control Protocol)。TCP协议是面向连接的通信协议,即传输数据之前,
在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可
靠。
第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
第三次握手,客户端再次向服务器端发送确认信息,确认连接。
基础知识二: java中的相关类
- 客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应请求,两者建
立连接开始通信。
构造方法:public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。
注意:如果指定的host是null ,则相当于指定地址为回送地址。
(这解释了为什么代码完成后要先运行服务端部分,再运行客户端部分,否则会报错)
成员方法:public InputStream getInputStream() :
public OutputStream getOutputStream() :
public void close() :关闭此套接字。
一旦一个socket被关闭,它不可再使用。
关闭此socket也将关闭相关的InputStream和OutputStream 。
public void shutdownOutput() : 禁用此套接字的输出流。
任何先前写出的数据将被发送,随后终止输出流。 - 服务端: java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启一个服务,并等待客户端
的连接。
构造方法
public ServerSocket(int port) :
成员方法
public Socket accept() :
代码实现
关于服务端
package cn.java.Aboutserver;
//这是服务端
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServersocket {
public static void main(String[] args) throws IOException {
//创建服务端Serversocket类对象
ServerSocket server=new ServerSocket(6666);
System.out.println("服务端启动,等待连接");
//接收数据并返回一个Socket对象
Socket ss=server.accept();
//获取客户端发来的数据
InputStream data=ss.getInputStream();
//注:后面几步只是为了把数据打印出来便于印证数据传输成功
//创建可存储数据的数组
byte[]arr=new byte[1024];
int len=data.read(arr);
//用String解析数组,打印字符串信息
String context=new String(arr,0,len);
//将改数据打印出来
System.out.println(context);
//回写数据
OutputStream hh=ss.getOutputStream();
hh.write("nice to meet you,I have received your letter".getBytes());
//至此,一次握手已完成
//最后记得关闭Socket and InputStream and OutputStream
server.close();
data.close();
hh.close();
}
}
关于客户端
package cn.java.Aboutserver;
//这是客户端,打错类名了
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Myserver{
public static void main(String[] args) throws IOException {
//创建客户端对象,(ip,port)确认连接到哪里
Socket client=new Socket("localhost",6666);
//创建输出流,发送请求
OutputStream kk=client.getOutputStream();
kk.write("hello,nice to meet you!".getBytes());
System.out.println("客户端创建成功,已发送请求,等待连接");
//创建输入流对象,接收回写数据
InputStream qq=client.getInputStream();
//后面几步数据都是为了将接受到的数据显示在控制台上便于验证
byte[]backarr=new byte[1024];
int len=qq.read(backarr);
//用String解析数组,打印字符串信息
String context=new String(backarr,0,len);
//将改数据打印出来
System.out.println(context);
//最后记得关闭Socket and InputStream and OutputStream
client.close();
kk.close();
qq.close();
}
}
效果:
感谢你能看到这里!