Java 简单客户端服务器发送信息报 connection rest

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务器类
 * 
 * 核心类:ServerSocket:Java中用来表示服务器的类
 * 
 * 服务器中:
 * Socket client = server.accept();
 * 封装了客户端发送过来的消息的字节流
 * 可以从中读取客户端发送过来的消息
 * InputStream is = client.getInputStream();
 * 封装了向客户端发送消息的字节输出流
 * OutputStream os = client.getOutputStream();
 *
 */
public class TCPServer {
	
	/**
	 * 创建并启动服务器的方法
	 */
	public void start() {
		try {
			//创建服务器
			//8888:端口号
			ServerSocket server = new ServerSocket(8888);
			System.out.println("服务器正在启动,等待用户接入.......");
			//while()循环可以保证服务器一直开启并且等待客户端的连接
			while(true) {
				//等待客户端连接
				//accept()会一直等待客户端的连接,调用accept()方法服务器就会进入挂起状态,
				//不会再往下执行代码,直到有客户端连接后,才会继续往下执行
				Socket client = server.accept();
				//得到客户端的IP地址
				System.out.println("IP为:"+client.getInetAddress());
				//启动线程
				new ClientThread(client).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		//创建对象
		TCPServer server = new TCPServer();
		server.start();
	}
}

/**
 * 服务器发送消息
 * 服务器读取消息
 */
class ClientThread extends Thread{
	//连接到服务器的客户端
	Socket client;

	
	public ClientThread(Socket client) {
		this.client = client;
	}
	
	@Override
	public void run() {
		try {
			//向客户端发送消息
			//获取字节输出流
			OutputStream os = client.getOutputStream();
			//字符缓冲输出流  BufferedWriter/PrintWriter
			PrintWriter pw = new PrintWriter(os);
			//发消息
			pw.println("...");
			pw.flush();//刷新
			
			//获取字节输入流
			InputStream in = client.getInputStream();
			//字符缓冲输入流  BufferedReader
			BufferedReader br = new BufferedReader(
					new InputStreamReader(in));
			//我们自定义客户端第一次发送过来的消息作为昵称
			String name = br.readLine();
			
			//接收客户端发送过来的消息
//			//获取字节输入流
//			InputStream in = client.getInputStream();
//			//字符缓冲输入流  BufferedReader
//			BufferedReader br = new BufferedReader(
//					new InputStreamReader(in));
			String line = null;
			while((line=br.readLine())!=null) {
				System.out.println("客户端说:"+line);
				
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}
package test;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * 客户端类
 * 核心类:Socket
 *
 */
public class TCPClient {
	/**
	 * 打开客户端的方法
	 */
	public void open() {
		try {
			//创建客户端
			//Socket(服务器的IP地址,服务器提供的端口号)
			//端口号必须要和服务器提供的端口号保持一致
			//本机的IP地址:127.0.0.1或者localhost
			Socket client = new Socket("localhost",8888);
			System.out.println("连接服务器成功,偶耶!");
			
			//获取字节输入流对象
			InputStream in = client.getInputStream();
			//启动读取服务器消息的线程
			new ReadFromServer(in).start();
			
			//获取字节输出流对象
			OutputStream out = client.getOutputStream();
			//启动WriteToServer的线程
			new WriteToServer(out).start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		TCPClient client = new TCPClient();
		client.open();
	}
}

/**
 * 客户端用来读取服务器发送消息的线程
 */
class ReadFromServer extends Thread{
	//字节输入流
	InputStream in;
	//对应的构造方法
	public ReadFromServer(InputStream in) {
		this.in = in;
	}
	@Override
	public void run() {
		//读取内容
		//字符缓冲输入流BufferedReader(每次读取一行)
		BufferedReader br = new BufferedReader(
				new InputStreamReader(in));
		String line = null;
		try {
			while((line=br.readLine())!=null) {
				//System.out.println("服务器说:"+line);
				System.out.println(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(br!=null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

/**
 * 客户端向服务器发送消息的线程
 *
 */
class WriteToServer extends Thread{
	//字节输出流
	OutputStream out;
	public WriteToServer(OutputStream out) {
		this.out = out;
	}
	@Override
	public void run() {
		Scanner key = new Scanner(System.in);
		//字符缓冲输出流BufferedWriter/PrintWriter
		PrintWriter pw = new PrintWriter(out);
		while(true) {
			//接收用户输入的内容
			String msg = key.nextLine();
			//发消息
			pw.println(msg);
			pw.flush();
		}
	}
}

别人运行不会报错自己两台电脑都会报错

 

连接重置了。是由于读没读到数据导致的。逻辑问题。