-
客户端:
import java.io.BufferedReader; import java.io.IOException; import
java.io.InputStreamReader; import java.io.OutputStreamWriter;
import java.io.PrintWriter; import java.net.InetAddress; import
java.net.Socket; import java.util.Scanner;public class Client { public static void main(String[] args) throws Exception{ //打开一个套接字,准备发送请求 Socket socket = new Socket("localhost", 8888);//得先建立连接,就是所谓的TCP是建立可靠的连接 System.out.println("尊敬的VIP客户,请求数据小分队已准备好,请输入您的请求:"); //向服务端发送带着客户端请求的数据,这个请求数据是从键盘读入的,发送给服务端是以PrintWriter的形式包装 PrintWriter out =new PrintWriter(socket.getOutputStream(),true); //输入流getInputStream(),单独开一个线程在Receive类中完成接收服务器发来的数据 Thread t = new Thread(new Receive(socket)); t.start(); Scanner scanner =new Scanner(System.in);//键盘输入 while(scanner.hasNextLine()){ out.println(scanner.nextLine());//将从键盘输入的数据发送出去 } } } class Receive implements Runnable { private Socket socket; public Receive(Socket socket) { this.socket=socket; } @Override public void run() { try { Scanner scanner =new Scanner(socket.getInputStream());//接收数据 String str =null; while(true){ str=scanner.nextLine(); System.out.println("服务器说:"+str);//打印接收的数据 } } catch (IOException e) { e.printStackTrace(); } } }
服务端:
public class Server {
public static void main(String[] args) throws Exception{
ServerSocket server = new ServerSocket(8888);//在端口8888开一个服务,监听客户端发来的请求,准备接收客户端发来的请求数据
System.out.println("服务端准备完毕,随时待命接收请求!");
Socket socket =server.accept();//只有当有客户端请求并连接时,才回返回一个Socket对象,这个对象就是带着客户端请求的那个Socket对象
//创建一个PrintWriter的实例对象out来完成服务端向客户端的输出数据的任务,
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
//单独开一个线程接收从客户端过来的请求,在Receive1类中完成数据的接收
Thread t = new Thread(new Receive1(socket));
t.start();
/*一定要理解Socket是一个用于机器之间通信的类*/
//发送数据给客户端
Scanner scanner = new Scanner(System.in);//键盘输入服务端要发给客户端的数据
while(scanner.hasNextLine()){
out.println(scanner.nextLine());//将键盘输入的服务端要发给客户端的数据封装在PrintWriter类的对象中
}
} }
class Receive1 implements Runnable {
private Socket socket;
public Receive1(Socket socket) {
this.socket=socket;//在服务端接收客户端发来的数据需要调用Receive1()这个方法,就会得到一个Socket对象,这个对象就是携带着客户端请求的socket
}
@Override
public void run() {
try {
Scanner scanner=new Scanner(socket.getInputStream());//获得客户端从键盘接收的输入流
String str = null;
while(true){
str=scanner.nextLine();
System.out.println("客户端发来的数据:"+str);
}
} catch (IOException e) {
e.printStackTrace();
}//接收数据
}
}