java 网络协议(一)Tcp多线程服务器端编程

[b]1,通用服务器代码[/b]:
package multiThread;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
//通用多线程服务器?????????????????
public class MTServerBase extends Thread {

// client
protected Socket socket;

// Here is the thread that does the work
// Presumably you'll override this in the subclass
public void run() {
try {
String s = "I'm a test server. Goodbye";
socket.getOutputStream().write(s.getBytes()); //发送给客户端

byte[] b = new byte[40]; //读客户端
socket.getInputStream().read(b);
System.out.println("服务器端显示:"+new String(b));
socket.close();
} catch (Exception e) {
System.out.println(e);
}
}
public static void startServer(int port, Class clobj) {
ServerSocket ssock;
try {
ssock = new ServerSocket(port);
System.out.println("Listening...");
while (true) {
Socket esock = null;
try {
esock = ssock.accept();

System.out.println("connected...");
// create new MTServerBase or subclass
MTServerBase t = (MTServerBase) clobj.newInstance();
t.socket = esock;
t.start();
} catch (Exception e) {
try {
esock.close();
} catch (Exception ec) {
}
}
}
} catch (IOException e) {
}
// if we return something is wrong!
}
//test main simple
public static void main(String[] args) {
System.out.println("Starting server on port 1234");
MTServerBase.startServer(1234, MTServerBase.class);
}
}

可以直接用telnet客户端测试

[img]http://dl.iteye.com/upload/attachment/330740/931c4902-b748-33d8-9917-871c02bf3f94.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/330742/a0442d39-dacf-3dcc-884d-ed425147efbb.jpg[/img]

或者测试的客户端程序:
package multiThread;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost",1234);

InputStream is = socket.getInputStream();
OutputStream out = socket.getOutputStream();

byte[] b = new byte[40];
is.read(b);
String data = new String(b);
System.out.println("客户端显示:"+data);
out.write(("from client:"+data).getBytes()); //返回服务器
is.close();
socket.close();
}
}


[img]http://dl.iteye.com/upload/attachment/330746/707df02f-dee4-35e3-91ef-99bc524040a6.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/330744/255af496-c5be-3dd8-a5b2-27ce8a5c2fe3.jpg[/img]
[b]2,利用1所写的基类,实现一个特殊的server[/b]
package multiThread;
import java.io.*;
//使用基类组成另一个服务器的例子,将基类MTServerBase的main函数注释掉
public class UCServer extends MTServerBase {
//socket是父类中继承来的,代表客户端
public void run() {
try {
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
while (true) {
char c = (char) is.read();
// end on Control+C or Control+D
if (c == '\003' || c == '\004')
break;
os.write(Character.toUpperCase(c)); //为啥是返回telnet端,应该是服务器端才是啊????
}
socket.close();
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) {//参数为端口号
int n = Integer.parseInt(args[0]);
System.out.println("Starting server on port " + n);
startServer(n, UCServer.class);

}
}

telnet端输入的字母,返回为大写的字母

[img]http://dl.iteye.com/upload/attachment/330750/75f07e4d-17b5-3431-914e-f7e662fc8e49.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/330748/914e94f5-ee10-38bb-a782-58997b7c5568.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值