如何建立一个客户端和服务端
客户端
开启服务器
public class MsgServer {
public static void main(String args[]) throws IOException{
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器开启:ip:"+serverSocket.getInetAddress().getHostAddress()+"端口: "+serverSocket.getLocalSocketAddress());
System.out.println("等待中");
Socket client = serverSocket.accept(); //监听连接
这段代码创建了一个serversocket对象,端口号为8888,通过IP地址+端口能够唯一地确定一个程序,需要注意的是端口一般为5000+,否则可能与现有端口冲突
为了防止冲突,需要监听与客户端的连接
通过管道传输文本
InputStream inputStream = client.getInputStream();
OutputStream outputStream = client.getOutputStream();
//发送消息
String msg = "已连接到服务器";
byte[] msgBytes = msg.getBytes();
//发送消息长度
outputStream.write(msgBytes.length);
//发送消息内容
outputStream.write(msgBytes);
outputStream.flush(); //刷新缓冲 管道强制刷出
while (inputStream.read() != -1)
{
System.out.println((char)inputStream.read());
}
这段代码创建了服务端的输入和输出,管道的特点是上一步处理的结果作为下一步处理的输入,可以通过管道来发送信息
由于网络通信是通过字节码传输的,所以文字信息也要转换成字节码,并且避免使用中文符号
发送消息后刷新缓冲区,防止错误
while循环用于接收,显示客户端发送的消息
客户端
建立客户端
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",8888); //端口和IP地址为服务器的地址
}
}
读取消息
// 输入输出流对象
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
//传入地址,构造字节数组
int msglength = inputStream.read();
byte[] msgBytes = new byte[120];
//读入
inputStream.read(msgBytes);
String getmsg = new String(msgBytes);
System.out.println("来自服务器的消息:"+"长度为:"+msglength+" "+getmsg);
字节数组需要事先指定大小,并且占用一定资源,因此需要合理设置
输入输出与服务器大致相同,同样适用于管道模型
相关知识
发送文字需要将字符串变为一个或多个字节码,接受文字则需要将字节码合并为字符串
在收发过程中采用的编码通常为Unicode,一个字节表示一个字
用于发送中文等其他文字时,可能采用1~6个字节,使用UTF-8编码,中文为3个字节,2个字节存储信息,一个字节判断是否为中文
网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等,通常分为TCP和UDP两种
TCP是面向连接的,稳定的协议
UDP是数据报的形式,需要固定频段发送,需要接收者实时接收
TCP的握手协议分三步
1.服务端监听,客户端发送请求
2.服务端收到请求并应答,客户端收到应答,发送应答包
3.服务端收到应答