java多线程通信(服务器与多客户端)

基于TCP的多线程通信
服务器线程:
package com.netproject1;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Server extends Thread{
Socket client;//定义客户端套接字
DataInputStream datain=null;//定义数据输入流接收数据
InputStream in=null;
DataOutputStream dataout=null;//定义数据输出流传输数据
OutputStream out=null;
float result;//定义计算结果
int symbol;//定义符号
public Server(Socket client){
this.client=client;
}

public  void run() {
	
	try {
		in=client.getInputStream();//输入流接收
		datain=new DataInputStream(in);//流转换为数据
		out=client.getOutputStream();
		dataout=new DataOutputStream(out);
	while(true){
		float num_one=datain.readFloat();//读取整型数据
		symbol=datain.readInt();//读取数字代替的符号
		float num_two=datain.readFloat();//读取第二次输入的数字
		System.out.println("客户信息为:"+num_one+symbol+num_two);//显示从客户端发来的数据
		switch(symbol){//计算
			case 0:result=num_one+num_two;break;
			case 1:result=num_one-num_two;break;
			case 2:result=num_one*num_two;break;
			case 3:result=num_one/num_two;break;
		}
		dataout.writeFloat(result);//向客户端传输计算结果
		Thread.sleep(2000);
		
			} 
	}catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
		e.printStackTrace();
	}
	try {//关闭套接字及各种流
		in.close();
		datain.close();
		out.close();
		dataout.close();
		client.close();
	} catch (IOException e) {
		System.out.println(client.isConnected());
		e.printStackTrace();
			}
	}
}

服务器主方法:
package com.netproject1;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
//客户端断开后可以进行重新连接
public static void main(String[] args) {
ServerSocket server=null;
Socket client=null;
try {
server=new ServerSocket(6688);//创建服务器套接字
System.out.println(“服务器已启动,正在等待客户端连接…”);
}catch (IOException e) {
System.out.println(“服务器套接字创建错误”);
}
while(true){
try {
client=server.accept();//连接客户端
System.out.println(“客户端已连接,可以进行通信…”+client);
} catch (IOException e1){
System.out.println(“客户端连接出错”);
}
if(client!=null){//用于同时连接多个客户端
new Server(client).start();
}
}
}
}
客户端线程:
package com.netproject1;

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.util.Scanner;

public class Client extends Thread{

	Socket mysocket=null;
	DataInputStream datain=null;
	InputStream in=null;
	DataOutputStream dataout=null;
	OutputStream out=null;
	
	public Client(Socket mysocket){
		this.mysocket=mysocket;
	}
	public void run(){
	try {
		out=mysocket.getOutputStream();
		dataout=new DataOutputStream(out);
		in=mysocket.getInputStream();
		datain=new DataInputStream(in);
		while(true){//循环输入数据,发送数据,读取数据
			Scanner scanner = new Scanner(System.in);//从键盘输入
			float num_one=scanner.nextFloat();//第一个数字
			int symbol=scanner.nextInt();//输入数字代替运算符号
			float num_two=scanner.nextFloat();//第二个数字
			dataout.writeFloat(num_one);//发送首数字
			dataout.writeInt(symbol);//发送运算符号
			dataout.writeFloat(num_two);//发送首数字
			float result=datain.readFloat();//读取运算结果
			System.out.println("计算结果为:"+result);//打印运算结果
			Thread.sleep(2000);//线程休息
			
		}	
	} catch (IOException ee) {
		ee.printStackTrace();
	}catch (InterruptedException e) {
		e.printStackTrace();
	}
	try {//关闭套接字及各种流
		in.close();
		datain.close();
		out.close();
		dataout.close();
		mysocket.close();
	} catch (IOException e) {
		e.printStackTrace();
		}
	}

}
客户端主方法:
package com.netproject1;
import java.io.IOException;
import java.net.Socket;

public class ClientDemo {

public static void main(String[] args) {
	Socket mysocket=null;
	try {
		mysocket=new Socket("localhost",6688);//创建本地套接字
	} catch (IOException e) {
		e.printStackTrace();
	}
	new Client(mysocket).start();//线程启动
}

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值