目标需求
实现一个简单的会说话的汤姆猫。
设计思路
通过Socket编程来简单实现服务器对客户端输入的数据加工,再输出到客户端。
实现代码
- 服务器代码
package demo5.chatroom;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServiceTest {
public static void main(String[] args) {
//定义输出流dos
DataOutputStream dos = null;
//定义输入流dis
DataInputStream dis = null;
//实例化Socket
Socket s1 = null;
try {
//实例化ServerSocket,并将端口8888给ServerSocket
ServerSocket s = new ServerSocket(8888);
System.out.println("服务端已经启动!");
//当s1接到8888端口的请求
s1 = s.accept();
//获得到输出流地址
dos = new DataOutputStream(s1.getOutputStream());
//获得到输出流地址
dis = new DataInputStream(s1.getInputStream());
//定义Str存放数据
String str = null;
//接收信息
while(true) {
if((str = dis.readUTF()).equals("88")==false) {
System.out.println("客户端输入姓名:" + str);
dos.writeUTF("Tom said: " + str + "!");
}else {
dos.writeUTF("Tom said: " + str + "!");
break;
}
}
} catch (IOException e) {
System.out.println("服务端启动失败!");
e.printStackTrace();
}finally{
try {
//关闭输入输出流
dis.close();
dos.close();
//关闭连接
s1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 客户端代码
package demo5.chatroom;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ClientTest {
public static void main(String[] args) {
//定义输出流dos
DataOutputStream dos = null;
//定义输入流dis
DataInputStream dis = null;
//实例化socket
Socket socket = null;
String s = null;
try {
//实例化socket,端口号为8888,ip为localhost,建立连接
socket = new Socket("localhost", 8888);
//获得到输出流地址
dos = new DataOutputStream(socket.getOutputStream());
//获得到输出流地址
dis = new DataInputStream(socket.getInputStream());
while(true ){
System.out.println("I said:");
//从控制台获取输入
Scanner input = new Scanner(System.in);
String name = input.next();
// 客户端向服务器端发送请求的内容
dos.writeUTF(name);
dos.flush();
if((s = dis.readUTF()).equals("Tom said: 88!")==false ) {
System.out.println(s);
}else {
System.out.println(s);
break;
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
//关闭输入输出流
dis.close();
dos.close();
//关闭连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
遇到的问题以及自己的理解
开始实现时候,因为在服务器的循环的判断中,对IO和Socket没有很好的理解,使用这样的代码:
在else中没有写dos.writeUTF("Tom said: " + str + "!");
这句,导致了出现java.io.EOFException
这个错误,具体如下图:
通过百度得知有可能是dis或者dos其中一个关闭了,而另一个却没有,导致出现这种错误。Java socket中关闭IO流的情况。
仔细研究了一下代码,我认为如果我没有写dos.writeUTF("Tom said: " + str + "!");
,代码继续执行,执行到后面把输入输出流关闭,导致在客户端的代码之中(s = dis.readUTF())
获取不到我们想传输的数据,所以报错。