一、简单的客户端与服务器交互(客户端向服务器发送数据,服务器将数据再返回给客户端)
服务端
* 1、创建服务器 指定端口 ServerSocket(int port)
* 2、接收客户端连接 阻塞时
* 3、发送数据
* 接收多个客户端
Mulityserver.java
packagecn.Tcp;/** 服务端
* 1、创建服务器 指定端口 ServerSocket(int port)
* 2、接收客户端连接 阻塞时
* 3、发送数据
* 接收多个客户端*/
importjava.io.DataOutputStream;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;public classMulityserver {public static void main(String[] args) throwsIOException {//1、创建服务器 指定端口 ServerSocket(int port)
ServerSocket server=new ServerSocket(8488);//2、接收客户端连接 阻塞时
while(true) { //死循环 一个accept() 一个客户端
Socket socket=server.accept();
System.out.println("一个客户端建立连接");//3、发送数据
String msg="欢迎使用";//输出流
DataOutputStream dos=newDataOutputStream(socket.getOutputStream());
dos.writeUTF(msg);
dos.flush();
}
}
}
客户端
Client.java
packagecn.Tcp;importjava.io.DataInputStream;importjava.io.IOException;importjava.net.Socket;importjava.net.UnknownHostException;public classClient {public static void main(String[] args) throwsUnknownHostException, IOException {//1、创建客户端 必须指定服务器+端口 此时就在连接
Socket client=new Socket("localhost",8488);//2、接收数据
DataInputStream dis =newDataInputStream(client.getInputStream());
String echo=dis.readUTF();
System.out.println(echo);
}
}
效果:
二、多线程实现客户端与服务器端交互(客户端不断的发送,服务器不断的返回)
1)关闭流的方法
CloseUtil.java
packagechatdemo02;importjava.io.Closeable;importjava.io.IOException;/** 关闭流的方法*/
public classCloseUtil {public static voidcloseAll(Closeable... io) {for(Closeable temp:io) {try{if(null!=temp) {
temp.close();
}
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
2)发送数据的线程
Send.java
packagechatdemo02;importjava.io.BufferedReader;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.Socket;/** 发送数据 线程*/
public class Send implementsRunnable {//控制台输入流
privateBufferedReader console;//管道输出流
privateDataOutputStream dos;//控制线程
private boolean isRunning=true;publicSend() {
console=new BufferedReader(newInputStreamReader(System.in));
}publicSend(Socket client) {this();try{
dos=newDataOutputStream(client.getOutputStream());
}catch(IOException e) {//TODO Auto-generated catch block
isRunning=false;
CloseUtil.closeAll(dos,console);
}
}privateString getMsgFromConsole() {try{returnconsole.readLine();
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
}return "";
}/** 1、从控制台接收数据
* 2、发送数据*/
public voidsend() {
String msg=getMsgFromConsole();if(null!=msg&& !msg.equals("")) {try{
dos.writeUTF(msg);
dos.flush();//强制刷新
} catch(IOException e) {//TODO Auto-generated catch block
isRunning=false;
CloseUtil.closeAll(dos,console);
}
}
}
@Overridepublic voidrun() {//线程体
while(isRunning) {
send();
}
}
}
3)接收数据的线程
Receive.java
packagechatdemo02;/** 接收线程*/
importjava.io.DataInputStream;importjava.io.IOException;importjava.net.Socket;public class Receive implementsRunnable {//输入流
privateDataInputStream dis;//线程标识
private boolean isRunning=true;publicReceive() {
}publicReceive(Socket client) {try{
dis=newDataInputStream(client.getInputStream());
}catch(IOException e) {//TODO Auto-generated catch block
e.printStackTrace();
isRunning=false;
CloseUtil.closeAll(dis);
}
}/** 接收数据*/
publicString receive() {
String msg="";try{
msg=dis.readUTF();
}catch(IOException e) {//e.printStackTrace();
isRunning=false;
CloseUtil.closeAll(dis);
}returnmsg;
}
@Overridepublic voidrun() {//线程体
while(isRunning) {
System.out.println(receive());
}
}
}
4)服务端
Server.java
packagechatdemo02;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;/** 创建服务器
* 写出数据 :输出流
* 读取数据:输入流*/
public classServer {public static void main(String[] args) throwsIOException {
ServerSocket server=new ServerSocket(9999);
Socket client=server.accept();//写出数据//输入流
DataInputStream dis=newDataInputStream(client.getInputStream());
String msg=dis.readUTF();
System.out.println(msg);//输出流
DataOutputStream dos=newDataOutputStream(client.getOutputStream());
dos.writeUTF("服务器----->"+msg);
dos.flush();
}
}
5)客户端
Client.java
packagechatdemo02;importjava.io.BufferedReader;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.net.Socket;importjava.net.UnknownHostException;/** 创建客户端 :发送数据+接收数据
* 写出数据 :输出流
* 读取数据:输入流
* 输入流输出流在同一个线程内应该独立处理
*
*
**/
public classClient {public static void main(String[] args) throwsUnknownHostException, IOException {
Socket client=new Socket("localhost",9984);//控制台输入流
new Thread(new Send(client)).start(); //一条路径
new Thread(newReceive(client)).start();
}
}
运行 Server.java Client.java 效果如下: