多线程客户端与服务器简单实现:
服务器端:
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务器端
* 1.接收客户端发送的字符串,并显示
* 2.从键盘录入一个字符换,并返回给客户端
*
* 一次能给多个客户端提供服务
* @author ZhangYang
*
*/
public class Service {
public static void main(String[] args) throws Exception{
//创建了一个服务器ServerSocket对象并设置端口号
ServerSocket servicesocket = new ServerSocket(9999);
System.out.println("服务器端已经启动");
while (true) {
//监听9999端口
Socket socket = servicesocket.accept();
ThreadTool tt= new ThreadTool(socket);
Thread t = new Thread(tt);
t.start();
}
}
}
线程逻辑类
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
/**
* 一个线程的run逻辑,运行多次,提供socket服务
* @author ZhangYang
*
*/
public class ThreadTool extends Thread {
private Socket socket;
public ThreadTool(Socket socket) {
this.socket = socket;
}
Scanner input = new Scanner(System.in);
@Override
public void run() {
try {
InetAddress ip = socket.getInetAddress();
//构建网络输出流
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
//构建网络输入流
InputStream is = socket.getInputStream();//获取网络输入流
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
//从网络输入流获取客户端传过来的数据
String massage = dis.readUTF();
System.out.println("客户端"+ip.getHostAddress()+"说:" + massage);
System.out.println("请输入要对客户端"+ip.getHostAddress()+"说的话");
String sendMassage = input.next();
//通过网络输出流向客户端发送数据
dos.writeUTF(sendMassage);
dos.flush();
dos.close();
dis.close();
bis.close();
is.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;
/**
* 1.连接服务端
* 2.从键盘录入一个字符串并发送给服务端
* 3.接收服务端发送给客户端的字符串并显示
* @author ZhangYang
*
*/
public class Client {
public static void main(String[] args) throws Exception {
Scanner input = new Scanner(System.in);
while (true) {
//创建Socket对象,并指定服务器IP地址及端口号,相当于连接服务器
Socket socket = new Socket("127.0.0.1", 9999);
//构建网络输入流
InputStream is = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
//构建网络输出流
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
System.out.println("请输入给服务器端发送的数据");
String sendMassage = input.next();
//通过网络输出流发送到服务器端
dos.writeUTF(sendMassage);
dos.flush();//刷新缓冲区,将数据写到网络中
//通过网络流获取服务器端的数据
String massage = dis.readUTF();
System.out.println("服务器端说:" + massage);
dis.close();
dos.close();
socket.close();
}
}
}