今天要和大家分享的内容是关于计算机和服务器之间交互的场景模拟,不合理的地方还请各位大佬指正哦
正文
注:先上连接的代码,之后再进行拆分讲解
服务端
public class Test01 {
ServerSocket sc;
{
try {
sc = new ServerSocket(8888);//创建服务器
//模拟服务器持续工作 while
while(true){
System.out.println("Listen");
Socket socket = sc.accept();//监听客户端
System.out.println("Clinet Connection "+socket.getInetAddress() );
//绑定客户端的连接地址
InputStream is = socket.getInputStream();//返回连接者的输入流
int Len = is.read();//获取具体的长度
byte []bytes = new byte[Len];//获取具体长度,创建具体大小数组
for (int i = 0; i < Len; i++) {
bytes[i] =(byte) is.read();//读到数据存入数组中
}
String msg = new String(bytes);//byte -> string
System.out.println("get:"+msg);//输出获得数据
//关闭资源
is.close();
sc.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Test02().ServerSocketLink();
}
}
客户端
public class Test03 {
public void link()
{
try {
//连接
Socket sc = new Socket("127.0.0.1",668);//连接服务器 127.0.0.1本机ip
//准备消息
String name = "i am pzy";//准备发送消息
OutputStream os = sc.getOutputStream();//返回输出流
//数据类型转型
byte [] bytes = name.getBytes();//String -> byte
//先把字符长度传递给服务器
int Len = bytes.length;//获取输入字符长度
os.write(Len);//把长度传给服务端
for (int i = 0; i < Len; i++) {
os.write(bytes[i]);//消息发送给输出流
}
//关闭资源
os.flush();//刷新管道
os.close();
sc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Test03().link();
}
}
步骤拆解
服务器的初始化
ServerSocket sc = new ServerSocket(688);//668代表连接的端口
值得一提的是服务器一般都是全年开启的,所以在此做一下具体的模拟,此处加入循环即可
while(){
System.out.println("Listen");
- 监听客户端
Socket socket = sc.accept();//监听客户端
System.out.println("Clinet Connection: "+socket.getInetAddress());//获取客户端连接的ip地址
- 获取输入流
InputStream is = socket.getInputStream();//返回客户端的输入流
- 读取输入流数据存储到容器中
int Len = is.read();//获取输入流中信息长度
byte []bytes = new byte[Len];//初始化长度相同的存储容器
for(int i = 0;i<Len;i++){
byte[i]=(byte)is.read();//数据存储 -> 容器
}
System.out.println("get:"+new String(bytes));//这句代码和下面两行是功能相同的
String msg = new String(bytes);//byte -> String
System.out.println("get:"+msg);//终端连接反馈
- 关闭资源
is.close();//关闭输入流资源
sc.close();//关闭服务器资源
注:上述代码都在while循环当中
作用:模拟一直运行服务器状态
客户端连接初始化
- 连接
Socket sc = new Socket("127.0.0.1",668);
//127.0.0.1代表本机的IP地址
//668代表和上面服务端相同的连接端口号
- 发送消息准备
String name = "I am xxx";//发送消息的字符串
- 输出流准备
OutputStream os = sc.getOutputStream();
- 发送消息类型转换
为什么要进行类型转换,String为什么不能发送?
byte [] bytes = os.getbytes();//String -> byte
- 告诉服务器传入数据长度
int Len = bytes.length;
os.write(Len);
- 写入输出流(准备输出给服务器)
for(int i = 0; i<Len;i++){
os.write(bytes[i]);//输出bytes中存储的数据
}
- 刷新管道(可能会出现为发送完毕的情况,刷新管道能够强行把数据输出)
os.flush();
- 关闭资源(用完了要及时关闭,养成良好编码习惯)
os.close();//关闭输出流
sc.close();//关闭客户端
以上就是本次信息通信的解析内容了,我们下期再见