您的位置:首页 > 理论基础 > 计算机网络

java网络编程基于TCP的多客户端连接服务器

2016-09-02 15:05 721 查看

一、使用多线程实现多客户端连接服务端代码:

package com.test.net;

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

class TCPThreadServerSocket implements Runnable {
private Socket socket = null;
private InputStream in = null;
private OutputStream out = null;
public TCPThreadServerSocket(Socket s) {
this.socket = s;
}

@Override
public void run() {
try {
//获取服务端输入的消息
in = socket.getInputStream();
//服务端返回的消息
out = socket.getOutputStream();
//用一个字节数字来存放消息,提高效率
byte[] recData = new byte[1024];
in.read(recData);
String data = new String(recData);

System.out.println("读取到客户端发送来的数据:" + data);
//返回给客户端的消息
out.write("Hello client I am server".getBytes());

} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//关闭资源
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

public class TCPThreadServer {
private static final int PORT = 6666;

public static void main(String[] args) {
int count = 1;
try {
/**
* 创建一个ServerSocket对象,并给它制定一个端口号,
* 通过这个端口号来监听客户端的连接,服务端接受客户端连接的请求是
* 不间断地接受的,所以服务端的编程一般都永无休止的运行
*/
ServerSocket ss = new ServerSocket(PORT);
System.out.println("服务器已经启动。。。");
while (true) {
/**
* 在服务端调用accept()方法接受客户端的连接对象,accept()方法是
* 一个阻塞式的方法,一直傻傻地等待着是否有客户端申请连接
*/

Socket s = ss.accept();
System.out.println("第" + count + "个连接,IP地址是:"
+ s.getInetAddress());
count++;
/**
* 服务端使用多线程方便多客户端的连接
* 这里将服务端的socket传给内部类,方便每个客户端都创建一个线程
*/
Thread t = new Thread(new TCPThreadServerSocket(s));
t.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}

}

二、客户端A代码:

package com.test.net;

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

public class TCPClientASocket {

private static final int PORT = 6666;

public static void main(String[] args) {
Socket s = null;
OutputStream out = null;
InputStream in = null;
DataOutputStream dos = null;
DataInputStream dis = null;
String serverHost = "127.0.0.1";
byte[] b = new byte[1024];
try {
/**
* 客户端通过IP和端口和服务器连接,连接上服务端后
* 就可以像服务端输出消息和接受服务端返回的消息
* 通过IP就能找到一台独一无二的电脑终端,通过PORT找到
* 终端的某一个独立的应用程序
*/
s = new Socket(serverHost, PORT);
out = s.getOutputStream();
dos = new DataOutputStream(out);
dos.write("Hello Server I am client A".getBytes());
in = s.getInputStream();
dis = new DataInputStream(in);
dis.read(b);
String serverToClient = new String(b);
System.out.println("服务端返回到客户端的信息:"+serverToClient);
} catch (UnknownHostException e) {
System.out.println("Host未知。。。");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//最后要关闭资源
out.close();
in.close();
dos.close();
dos.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}

客户端B代码和A的基本一样

三、运行结果:

先启动服务端再运行客户端A代码和客户端B代码,运行结果如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程 socket tcp
相关文章推荐