JAVA 客户端多线程和服务器源码

服务器代码
tcp_server.java

package com.tcp.com;

import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class tcp_server {
	public static void main(String[] args) throws IOException{
		
		ServerSocket server = new ServerSocket(8889);
		
		System.out.println("-------服务器已启动----------");
		Socket socket = server.accept();
		System.out.println("一个客户端建立连接");
		String  msg="欢迎使用";
		
		DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
		DataInputStream dis = new DataInputStream(socket.getInputStream());
		
		while(true){
			String str=dis.readUTF();
			System.out.println("服务器-接收到->客户端数据:"+str);
			dos.writeUTF(str);
			System.out.println("服务器发送数据给客户端:"+str);
		}
		//输出流
		/*
		BufferedWriter bw = new BufferedWriter(
				new OutputStreamWriter(
				socket.getOutputStream()));//字节流
		bw.write(msg);
		bw.newLine();
		bw.flush();//刷新该流的缓冲
		*/
//		//将表示长度信息的两个字节写入输出流,后跟字符串 s 中每个字符的 UTF-8 修改版表示形式
//		dos.writeUTF(msg);
//		dos.flush();
	}
}

客户端代码:
tcp_client.java

package com.tcp.com;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class tcp_client
{
   public static void main(String [] args) throws UnknownHostException, IOException
   {
	   Socket client = new Socket("localhost",8889);
	   //创建发送的线程类对象
	   Send send = new Send(client);
	   
	   //创建接收的线程类对象
	   Receive receive = new Receive(client);
	   
	   //创建Thread类对象并启动线程
	   new Thread(send).start();
	   new Thread(receive).start();
   }
}

客户端接收线程
Receive.java

package com.tcp.com;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

public class Receive implements Runnable{//具备多线程能力

	private	DataInputStream dis;
	private boolean flag=true;
	
	public Receive(Socket client) {
		try {
			dis = new DataInputStream(client.getInputStream());
		} catch (IOException e) {
			flag=false;
			CloseUtil.closeAll(dis,client);
		}
	}
	private String getMessage(){
		String str = "";
		try {
			str = dis.readUTF();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			flag=false;
			CloseUtil.closeAll(dis);//IO流进行关闭
		}
		return str;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(flag){
			System.out.println(this.getMessage());
		}
	}
}

客户端send线程:
Send.java

package com.tcp.com;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Send implements Runnable{

	//从键盘获取数据
	private BufferedReader br;
	//发送数据的数据流
	private DataOutputStream dos;
	private boolean flag=true;
	
	//Send方法可以重载 (方法名相同,参数不同,返回值不同)
	public Send() {
		br = new BufferedReader(new InputStreamReader(System.in));//键盘获取数据
	}
	public Send(Socket client ){
		this();//调用本类的无参构造方法
		try {
			dos = new DataOutputStream(client.getOutputStream());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			flag=false;
			CloseUtil.closeAll(dos,client);
		}
	}
	//获取信息的方法
	private String getMessage(){
		String str="";
		try {
			str = br.readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			flag = false;
			CloseUtil.closeAll(br);//流关闭
		}
		return str;
	}
	private void send(String str){
		try {
			dos.writeUTF(str);
			dos.flush();//清空缓冲
		} catch (IOException e) {
			// TODO Auto-generated catch block
			flag = false;
			CloseUtil.closeAll(dos);//流关闭
		}
		
	}
	
	@Override//重写
	public void run() {
		while(flag){
			this.send(getMessage());
		}
	}
}

CloseUtil.java

package com.tcp.com;

import java.io.Closeable;

public class CloseUtil {
	public static void  closeAll(Closeable... able) /*...为可变参数*/{
		for(Closeable c:able){
			if(c!=null){
				try {
					c.close();
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
				
		}
	}
}

运行步骤1:
先运行tcp_server.java
再运行tcp_client.java
在client中断输入hello world
结果如图所示:

运行结果如图所示:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190704161128560.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5OTc1Mg==,size_16,color_FFFFFF,t_70)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190704161256559.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjM5OTc1Mg==,size_16,color_FFFFFF,t_70)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值