Java Socket 练习

OOP h16

完成 MyServer 类,随机测试向服务器端输入几句话,要求服务器端原封不动返回,向服务器端输入 bye ,表示断开连接。

开始没有完全理解,需要启动线程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* MyServer.java
*/
package com.huawei.classroom.student.h16;


/**
* @author super
*
*/
public class MyServer {


public MyServer() {
}

public void startListen(int port) {
Thread serverThread = new ServerThread(port);
serverThread.start();
}
}

新建 ServerThread 类继承 Thread,用于监听端口。

会用到的成员变量:

1
2
3
4
5
6
7
private final int port;// 端口
private ServerSocket server;// 服务器
private Socket socket;// socket
private InputStream in;// 输入流
private OutputStream out;// 输出流
private static final int MAX_LEN = 100;// 最大长度
private static final String STOP_STRING = "bye" + "\r\n";// 断开连接口令

构造方法:

1
2
3
4
5
6
7
public ServerThread(int port) {
server = null;
socket = null;
in = null;
out = null;
this.port = port;
}

重写 run

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
@Override
public void run() {
try {// Test 没有捕获异常,这里不能抛出
server = new ServerSocket(port);// 服务器
socket = server.accept();// 等待客户端连接
in = socket.getInputStream();// 获取客户端输入流
out = socket.getOutputStream();// 获取客户端输出流
byte[] data = new byte[MAX_LEN];// 读取的字节
int readed = in.read(data);// 从输入流读,读取的长度
String line = new String(data, 0, readed);// 字符串格式
while (!STOP_STRING.equals(line)) {// 没断开
out.write(line.getBytes());// 向输出流写
readed = in.read(data);// 再读
line = new String(data, 0, readed);
}
in.close();
out.close();
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
close(in);
close(out);
close(socket);
close(server);
}
}
public void close(Closeable inout) {
if (inout != null) {
try {
inout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

终于忙完了,一年的大创结束了……