server
package TestDown;import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketException;public class Server {public static void main(String[] args) throws IOException {//建立服务器端连接ServerSocket serverSocket = new ServerSocket(8888);//等待请求System.out.println("服务器启动!");//让服务器一直处于监听状态(这时服务器资源不用关闭)while(true){Socket socket = serverSocket.accept();//监听客户端发送过来信息//使用多线程提高效率。每监听到一个客户端发送消息就创建一个线程来接收信息,并处理//1.打印客户端信息(ip/端口)new Thread(new Runnable() {@Overridepublic void run() {try{//使用字节流接收数据InputStream in = socket.getInputStream();BufferedReader br = new BufferedReader((new InputStreamReader(in,"utf-8")));//读取数据//pw.newLine();/*如果服务器端使用了BufferedReader的readLine()方法,一定要做数据末尾添加换行符,不然readLine()将一直处于堵塞状态,服务器接收不到数据*/System.out.println("客户端ip:" + socket.getInetAddress() + "端口:" + socket.getPort() + ":"+br.readLine());} catch (SocketException s) {System.out.println("客户端"+socket.getInetAddress()+":"+socket.getPort()+"已退出!");} catch (IOException e) {e.printStackTrace();}finally {try {//服务器资源不用关闭//serverSocket.close();//关闭连接,关闭流socket.close();} catch (IOException e) {e.printStackTrace();}}}}).start();}}}
client
package TestDown;import java.io.*;import java.net.Socket;import java.net.UnknownHostException;import java.util.Scanner;/*** 客户端* 1.建立客户端* 2.连接后,通过socket中的流进行传输* 3.关闭**/public class Client {static Scanner sc = new Scanner(System.in);public static void main(String[] args) throws IOException {//添加功能,实现业务逻辑/*1.发送信息2.退出*///使用循环、线程实现多功能while (true){//用户选择操作System.out.println("请选择:1.发送消息 2.退出");String userInput = sc.next();switch(userInput){case "1"://发送消息send();break;case "2"://退出客户端System.exit(0);break;default:System.out.println("输入有误!请重新选择");}}}private static void send() throws IOException {//循环发送消息while (true){try{//建立客户端Socket socket = new Socket("127.0.0.1",8888);//建立连接后开始传输数据OutputStream out = socket.getOutputStream();BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out,"utf-8"));PrintWriter pw = new PrintWriter(bw);//输出数据System.out.print("发送(输入88退出):");String s = sc.next();//输入88结束程序if(s.equals("88")){System.exit(0);}pw.write(s);//pw.newLine();/*如果服务器端使用了BufferedReader的readLine()方法,一定要做数据末尾添加换行符,不然readLine()将一直处于堵塞状态,服务器接收不到数据*/pw.flush();//使用字符流一定要刷新缓存区,不然服务器读不到数据,返回null//告诉服务器不需要发生数据了socket.shutdownOutput();socket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally{try{//关闭//socket.close();}catch (Exception e){System.out.println(e);}}}}}
