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

博客内容展示了如何使用Java实现一个通用的多线程服务器(MTServerBase)和一个基于该服务器的特殊服务器(UCServer)。MTServerBase接受客户端连接并发送预设消息,然后读取并打印客户端响应。UCServer则进一步处理客户端输入,将接收到的字符转换为大写并返回。客户端程序(Client)连接到服务器并接收、显示服务器消息,同时发送回一条消息。
摘要由CSDN通过智能技术生成

1,通用服务器代码:

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客户端测试

545f8948663ac816d2831a2efb7447b2.png

4fe09017c5b76833e9e0cd172649de35.png

或者测试的客户端程序:

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();

}

}

ec906a36f12c4f07774889092ea1a24d.png

5ae433d72e68382d7bc3ed2bd4451012.png

2,利用1所写的基类,实现一个特殊的server

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端输入的字母,返回为大写的字母

a4dd5a3f54439eb1109e5bbf8b1381eb.png

981ac6db5a001f40d22807d31815a008.png

d87825dac561e7eef7516197e14df7f5.png

大小: 9.8 KB

ef1896cecbbf16fd2e1a0978eaf0eb80.png

大小: 6.5 KB

b16b69f592702a3551f1e9147c5cb270.png

大小: 9.7 KB

ab8411160ed5bf4ffd1d386d01c54a2f.png

大小: 17.7 KB

bda6b206390749c090dcbe17cd53948e.png

大小: 5.1 KB

ae18dd11331da2de286a9995a9fa57cf.png

大小: 11.4 KB

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2010-10-14 11:33

浏览 5321

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值