62,614
社区成员
发帖
与我相关
我的任务
分享
public class EchoThread extends Thread {
protected PrintStream out;
protected String message;
protected Socket clientSocket;
public EchoThread(Socket clientSocket) {
super();
try {
// 接受数据,但不允许有中文,因为会乱码
DataInputStream in = new DataInputStream(
clientSocket.getInputStream());
byte[] buffer = new byte[10000]; // 缓冲区的大小
in.read(buffer); // 处理接收到的报文,转换成字符串
/**
* C++传递过来的中文字,需要转化一下。C++默认使用GBK。
* GB2312是GBK的子集,只有简体中文。因为数据库用GB2312,所以这里直接转为GB2312
* */
message = new String(buffer, "GB2312").trim();
this.clientSocket = clientSocket;
// 获得输出输出流
out = new PrintStream(clientSocket.getOutputStream());
} catch (IOException ex) {
Logger.getLogger(EchoServerThread.class.getName()).log(
Level.SEVERE, null, ex);
}finally{
try {
if(clientSocket !=null)
clientSocket.close();
} catch (IOException ex1) {
Logger.getLogger(EchoServerThread.class.getName()).log(
Level.SEVERE, null, ex1);
}
}
}
public void run() {
try {
/**
* 这里需要使用底层的byte方法来传递。因为即使直接写字符串,到底层还是调用了传递byte的方法。
* 这里涉及到编码问题。C++默认使用GBK,而GB2312是GBK的子集。
*/
byte[] responseBuffer = new ClientRequestHandler(message)
.response().getBytes("GB2312");
out.write(responseBuffer, 0, responseBuffer.length);
// String test = new ClientRequestHandler(message).response();
// out.print(test);//直接UTF8输出,最终底层每个中文用3个字节传输
// out.print(new
// String(test.getBytes(),"GBK"));//转GBK失败,实际每个中文字用了4到5个字节传递
// out.print(new
// String(test.getBytes("GBK"),"GBK"));//转GBK,但底层还是要拆成字节数组,当然最终还是跟UTF8一样
// sleep(1000);
} catch (Exception ex) {
Logger.getLogger(EchoThread.class.getName()).log(Level.SEVERE,
null, ex);
}
try {
clientSocket.close();
} catch (IOException ex) {
Logger.getLogger(EchoThread.class.getName()).log(Level.SEVERE,
null, ex);
}
}
public String getMessage() {
return message;
}
/**
* 获取输出流
*
* @return
*/
public PrintStream getOutputStream() {
return out;
}
}
public class EchoServerThread {
// 服务端侦听的Socket
ServerSocket serverSkt = null;
// 构造方法
public EchoServerThread(int port) {
System.out.println("服务器代理正在监听,端口:" + port);
try {
// 创建监听socket
serverSkt = new ServerSocket(port);
} catch (IOException ex) {
Logger.getLogger(EchoServerThread.class.getName()).log(
Level.SEVERE, null, ex);
}
while (true) {
try {
// 接收连接请求
Socket clientSocket = serverSkt.accept();
EchoThread et = new EchoThread(clientSocket);
// et.setDaemon(true);
et.start();
} catch (IOException e) {
System.out.println("无法接受当前客户连接请求!");
break;
}
}
}
}
while (running) {
try {
Socket socket = socketServer.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
String cmd = reader.readLine();
CmdCenter cc = new CmdCenter(socket,reader,cmd);
cc.setDaemon(false);
cc.start();
} catch (Exception e) {
logger.error(e.getMessage());
}
}