Java中网络编程之TCP协议 (二)

2014-11-24 10:57:57 · 作者: · 浏览: 2
ue)
{
// 若无客户端发送请求则线程在此阻塞,方法不继续执行
Socket socket = serverSocket.accept();
System.out.println("connected");
InputStream instream = socket.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = instream.read(buffer)) != -1)
{
bos.write(buffer, 0, len);
}
instream.close();
bos.flush();
bos.close();
String msg = bos.toString();
System.out.println("客户端的IP:" + socket.getInetAddress().getHostAddress());
System.out.println("客户端的端口:" + socket.getPort());
System.out.println("客户端的信息:" + msg);
}
}
}
执行结果
connected
客户端的IP:127.0.0.1
客户端的端口:3775
客户端的信息:我是徐越1
connected
客户端的IP:127.0.0.1
客户端的端口:3787
客户端的信息:我是徐越2
三、多线程服务器
在实际应用中是在服务器上运行一个永久的程序,接收来自其他多个客户端的请求,提供相应的服务。需要利用多线程实现多客户机制。服务器在指定的端口上监听是否有客户请求,一旦监听到就会启动一个专门的服务线程来响应该请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。只要将服务端为如下代码,Client1和Client2就会异步执行。
[java]
/**
* 多线程服务端0
*
* @author 徐越
*
*/
public class MultiThreadServer0
{
// 端口号
private int port = 8821;
// 服务端
private ServerSocket serverSocket;
public MultiThreadServer0() throws IOException
{
// 创建服务器端
serverSocket = new ServerSocket(port);
System.out.println("服务器启动");
}
public void service()
{
while (true)
{
Socket socket = null;
try
{
// 客户端进行连接时会触发accept方法从而建立连接
socket = serverSocket.accept();
new MultiThreadHandler(socket).start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException
{
new MultiThreadServer1().service();
}
}
/**
* 多线程处理类
*/
class MultiThreadHandler extends Thread
{
private Socket socket;
public MultiThreadHandler(Socket socket)
{
this.socket = socket;
}
private BufferedReader getReader(Socket socket) throws IOException
{
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void run()
{
try
{
BufferedReader br = getReader(socket);
String msg = null;
while ((msg = br.readLine()) != null)
{
System.out.println("客户端的IP:" + socket.getInetAddress().getHostAddress());
System.out.println("客户端的端口:" + socket.getPort());
System.out.println("客户端的信息:" + msg);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (socket != null)
{
socket.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
/**
* 多线程服务端1
*/
public class MultiThreadServer1
{
// 端口号
private int port = 8821;
// 服务端
private ServerSo