java socket实现客户端和服务器聊天(不是传统的一问一答,客户端可以发多条信息给服务器,服务器再回复客户端)

版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/89203051

实现的效果如下


 涉及的知识点

 1、多线程

2、socket和serversocket的用法以及区别

3、字符串和byte[]数组的转化


服务器代码

1、输入流线程类InputStreamWay.java

package cn.com.server;

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

public class InputStreamWay extends Thread {
	// 1.继承Thread类
	// 2.重写run()方法
	public void run() {
		while (true) {
			OutputStream out;
			try {
				out = socket.getOutputStream();
				Scanner sc = new Scanner(System.in);
				String str = sc.next();
				System.out.println("我:" + str);
				out.write(str.getBytes());
				out.flush();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

	// 3.因为需要传参过来。所以需要重载一个构造函数
	private Socket socket;

	public InputStreamWay(Socket socket) {
		this.socket = socket;
	}
	// 4.设置一个全局变量
}

2、输出流线程类OutputStreamWay.java

package cn.com.server;

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

public class OutputStreamWay extends Thread {
	// 发送信息给客户端
	// 1.继承Thread父类
	// 2.重写run()方法
	// 3、需要用到一个socket参数,所以我要重载构造函数
	public void run() {
		while (true) {
			InputStream in;
			try {
				in = socket.getInputStream();
				byte[] b = new byte[1024];
				int len = 0;
				StringBuffer sb = new StringBuffer();
				String s = null;
				if ((len = in.read(b)) != -1) {
					s = new String(b);
					sb.append(s);
				}
				System.out.println("客户端信息:" + sb);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}

	// 目的:在其他类里面调用这个线程的时候,需要传入一个参数进来,但是传进来的仅仅是在构造函数里面
	// 为了让这个类其他的方法可以共享这个参数,因此我们需要设置一个全局变量,当构造函数有参数传进来的时候,把这个参数赋值给全局变量
	private Socket socket;

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

3、服务器入口代码

package cn.com.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class SSocket {
	public static void main(String[] args) {
		ServerSocket server;
			try {
				server = new ServerSocket(8090);
				Socket socket=server.accept();	
					System.out.println("----------");
					new InputStreamWay(socket).start();	 
					new OutputStreamWay(socket).start();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
	}
	//读取
	//
}

客户端代码

1、输入流线程类InputStreamWay.java和服务器的代码一样,

2、输出流线程类OutputStreamWay.java和服务器上面的代码一样,需要注意,在打印信息的时候,把来自客户端信息改成来自服务器信息

3、客户端入口代码

package cn.com.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ServerSocket {
//服务器端
	/*author:命运的信徒
	 * date:2019/4/10
	 * arm:做一个微型的qq
	 */
	//客户端发送信息
	
	public static void main(String[] args) {
		Socket socket=null;
			try {
				socket=new Socket("127.0.0.1",8090);
				System.out.println("=========");
				new InputStreamWay(socket).start();	 
				new OutputStreamWay(socket).start();
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}


		
	}
	
	
}

世上无难事,只怕有心人!

越是薄弱的地方,越是需要花心思在上面!


猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/89203051