java使用socket实现客户端与服务器聊天(一)实现终端模拟聊天

前两天,开始做一个简单的客户端与服务器进行聊天的程序,但是发现很多大佬写的以及视频教程中,仅仅是单向交流(只能由客户端向服务端发送消息,服务端打印输出),后来我用一个循环在两者代码互相加了一点代码,解决了这个毛病,但是又有了新的问题,只能由一方发送,一方接受,接收完才可以进行下面的任务,无限的等待啊,啊啊啊
在一番摸索,线程这两字频频的出现在我的眼前!我的问题也在其慢慢解决!
此文章也是用线程初次完善。

正文开始:

服务器代码:

 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
 
	public static void main(String[] args) {
		
		ServerSocket server;
		Socket socket;
		try {
			server=new ServerSocket(5252);
			socket = server.accept();
			In ta=new In(socket);
			Out te=new Out(socket);
			new Thread(ta).start();
			new Thread(te).start();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
 
}

客户端代码:

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
 
public class Client {
 

	public static void main(String[] args) {
		
		Socket socket;
		try {
			socket = new Socket("localhost",5252);
			In ta=new In(socket);
			Out te=new Out(socket);
			new Thread(ta).start();
			new Thread(te).start();
		} catch (UnknownHostException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

		
		
	}
}

因为客户端与服务器端都有相同的功能,实现起来也是完全一致,这个也是文章的重点,使用接口Runnable,一个是输出流,一个输入流实现,可写,可读

In类:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class In implements Runnable {
	private Socket socket;
	public In(Socket socket) {
		this.socket=socket;
	}
	
	public void run() {
		// TODO 自动生成的方法存根
		try {
			InputStream is = socket.getInputStream();
			InputStreamReader isr = new InputStreamReader(is, "UTF-8");
			BufferedReader br = new BufferedReader(isr);
			
			while(true){
				System.out.println("客户端说:" + br.readLine());
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

Out类:

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Out implements Runnable{
	Scanner sc=new Scanner(System.in);

	private Socket socket;
	public Out(Socket socket) {
	this.socket=socket;
	
	}
	@Override
	public void run() {
		// TODO 自动生成的方法存根
		while(true) {
		OutputStream out;
		try {
			out = socket.getOutputStream();
			OutputStreamWriter osw = new OutputStreamWriter(out, "UTF-8");
			PrintWriter pw = new PrintWriter(osw, true);			
			//创建Scanner读取用户输入内容
			Scanner scanner = new Scanner(System.in);
			String ft=null;
			while(true){
				ft=sc.next();
				pw.println(scanner.nextLine());
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}			
		
	}
	}
}

启发大佬https://blog.csdn.net/qiuyoungster/article/details/59101446

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值