题目:
代码如下:
package com.HM.tcp;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
(1) 利用 start 命令 启动三个线程。
(2) 利用 telnet 127.0.0.1 2008
(3) 输入 任意字符串。 按回车键。
*/
public class ReverseServer {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8001);
/***
* while(true){} 此语句后面的代码是不可能执行的。
*
* 所以要改成:Boolean bRunniing = true; while(bRunning){}
*
*
*
*/
boolean bRunning = true;
while(bRunning){
Socket s = ss.accept();
/* 服务器 接收客户端的连接请求 后,他与每个客户端连接回话的过程,都需要在一个单独的线程中来完成。
执行 绘画过程的代码 是在一个实现了Runnable接口类中 的 run()方法中 。
在 Servicer类中 需要接受一个Socket对象,我们再给他传递对象得时候 是不需要给他传递参数的。
错误 写法:new Servicer(Socket s)
并且 我们的构造函数 要接受 这么一个类型的参数。*/
new Thread(new Servicer( s){
}).start();
}
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.HM.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class Servicer implements Runnable {
private Socket s = null;
public Servicer(Socket s) {
this.s = s;
}
@Override
public void run() {
try {
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
// 便于 一次读取一行
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
// 添加 true 可以实现自动刷新 缓冲 区。
PrintWriter pw = new PrintWriter(ops,true);
// 不停的从客户端接收数据。
while (true) {
String strLine;
try {
// 读到这行内容。
strLine = br.readLine();
// 首先 要判断一下 : 假如输出的是 quit 就退出。
if(strLine.equalsIgnoreCase("quit")){
break;
}
String strEcho = (new StringBuffer(strLine).reverse()).toString();
// 送到 客户端。
pw.println(strLine + "---->" + strEcho);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
br.close();
pw.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
需要注意的一个细节:
当输入:abd 按backspace键 在输入 c 时, telnet 显示的是:dba,而服务器端 显示的是:cba
而 此字符串的长度为 5.则说明:
abd{backspace}c
逆序为:c{backspace}dba 所以 就把 c 删除了。这是 特殊键 造成的。。。
以上内容 源自 传智播客 张孝祥老师 网络编程 视频课程的学习总结。仅供 学习分享。
客户端的TCP:http://blog.csdn.net/itm_hadf/article/details/7529693