package com.itheima.d6_socket1;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
/**
* 完成Socket网络编程入门案例的客户端开发,实现一发一收
*/
public class ClientDemo1 {
public static void main(String[] args) {
try {
System.out.println("--------客户端启动成功---------");
//1.创建Socket通信管道有服务器的连接
//public Socket(String host, int port)
//参数一:服务端的IP地址
//参数二:服务端的端口
Socket socket = new Socket("127.0.0.1",7777);
//2.从socket通信管道中得到一个字节输出流,负责发送数据
OutputStream os = socket.getOutputStream();
//3.把低级的字节流包装成打印流
PrintStream ps = new PrintStream(os);
//4.发送消息
ps.print("我是TCP的客户端");
ps.flush();
//关闭资源
// socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.itheima.d6_socket1;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 开发Socket网络编程入门代码的服务器,实现接收消息
*/
public class ServiceDemo2 {
public static void main(String[] args) {
try {
System.out.println("--------服务端启动成功---------");
//1.注册端口
ServerSocket serverSocket = new ServerSocket(7777);
//2.必须用accept方法,等待接受客户端的Socket的连接请求,建立Socket通信管道
Socket socket = serverSocket.accept();
//3.从Socket通信管道得到一个字节输入流
InputStream is= socket.getInputStream();
//4.把字节输入流包装成缓冲字节输入流进行消息的接受
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//5.按照行读取信息
String msg;
while((msg = br.readLine()) != null){
System.out.println(socket.getRemoteSocketAddress().toString() + "说了:" + msg );
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
先运行服务端,在运行客户端出现以下错误:
原因:
ServiceDemo2中标红部分
readLine()强调一行,但是在 ClientDemo1中标红部分并没有换行符,会将“我是TCP的客户端”认为是发送了一半,并不认为是一行消息,导致客户端“殉情”。
改进一:
重新运行,结果:
运行一次后,又挂掉了。
改进二:再改进一的基础上,修改ServiceDemo2的部分代码
将while改为if,if只会执行一次,重新运行,结果如下,完美。