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

简单实现基于TCP的Socket多线程通信

2015-04-29 16:12 274 查看
/*
* 客户端
*/

public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",6666);
OutputStream os =   socket.getOutputStream(); //获取输出流,向服务器发送信息

PrintWriter pw = new PrintWriter(os);//将输出流包装成打印流
pw.write("客户端的信息来了");
pw.flush();//刷新缓冲向服务器发送信息
socket.shutdownOutput();

//接收服务器响应的消息
InputStream is = socket.getInputStream(); //得到字节流的对象
InputStreamReader isr = new InputStreamReader(is,"utf-8");//包字节流转换成字符流
BufferedReader br = new BufferedReader(isr);//构建缓冲区
String info = null;
while ((info=br.readLine())!=null) { //输出服务端接收的数据
System.out.println(info);
}
socket.shutdownInput();
//关闭资源
br.close();
isr.close();
is.close();

pw.close();
os.close();
socket.close();

} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


/**
* 服务器端
*
* @author Administrator
*
*/
public class Server {

public static void main(String[] args) {

try {
ServerSocket serverSocket = new ServerSocket(6666);// 给端口号
System.out.println("服务器开始监听了啊"); //给的一个提示
Socket socket = null;
int count = 0;
while (true) { //每个客户端给一个新线程

socket = serverSocket.accept();// 阻塞监听客户端消息,得到连接对象
ServerThread st = new ServerThread(socket);
//未设置线程优先级可能会导致运行时速度非常慢,可降低优先级
st.setPriority(4);//设置线程优先级,范围【1,10】默认为5
st.start();
InetAddress ia = socket.getInetAddress();
count++;
System.out.println("第"+count+"个客户端");
System.out.println("IP地址"+ia.getHostAddress());
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


/*
* 服务器端处理类
*/
public class ServerThread extends Thread {
public Socket socket;

public ServerThread(Socket socket){
this.socket = socket;
}

@Override
public void run() {
InputStream is =null;
InputStreamReader isr=null;
BufferedReader br=null;
OutputStream os = null;
PrintWriter pw =null;
try {
//监听客户端消息,得到连接对象
is = socket.getInputStream();//获取到客户端输入的,字节流
isr = new InputStreamReader(is);//将字节流转换成字符流
br = new BufferedReader(isr); //读取数据进入缓冲区
String data =null;
while((data=br.readLine())!=null){  //输出客户端接收的数据
System.out.println(data);
}
socket.shutdownInput();
os = socket.getOutputStream(); //获取输出流
pw = new PrintWriter(os);  //包装成打印流
pw.write("服务器说:给你会消息了");

pw.flush();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
//关闭资源
/*if(pw!=null){
pw.close();
}*/
if(os!=null){
os.close();
}
if(br!=null){
br.close();
}
if(isr!=null){
isr.close();
}
if(is!=null){
is.close();
}
if(socket!=null){
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: