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();
}
}
}
别人运行不会报错自己两台电脑都会报错
连接重置了。是由于读没读到数据导致的。逻辑问题。