2.创建ServerSocket的同时向系统申请对外的服务端口。注意, 该端口不能和其他程序冲突,否则会抛出地址被占用的异常
3.运行在服务端的服务端接口,客户端就是通过这个端口与服务端建立连接的。
监听服务端口,等待客户端连接。一旦一个客户端通过Socket与服务端建立连接,那么serversocket
会创建一个socket与该客户端通讯。
4.ServerSocket提供方法:
Socket accept()
该方法是一个阻塞方法,调用后即等待客户端的链接;一旦一个
客户端连接,那么accept方法就会返回一个Socket实例,通过
这个实例就可以与刚连接的客户端交互了
5.Socket,ServerSocket的对象可以在类的构造中创建。服务端创建ServerSocket,通过server.accept()监听客户端,客户端创建Socket。
一、向服务端发送一句:你好,客户端
服务端代码:
package day01; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * 服务端 * @author TEDU * */ public class Server { private ServerSocket server; public Server() throws IOException{ //初始化服务端,参数为监听的端口号 server=new ServerSocket(8098); } public void start(){ try { System.out.println("等待客户端连接"); Socket socket=server.accept();//监听客户端,此时进入阻塞状态 System.out.println("一个客户端已连接");//表示已经完成了客户端的连接 while(true){//当客户端连接后会自动停止,while true让服务端一直接收消息状态 InputStream nm=socket.getInputStream(); InputStreamReader mo=new InputStreamReader(nm,"UTF-8"); BufferedReader bi=new BufferedReader(mo); String st=bi.readLine(); if(st!=null){//信息如果不筛选就会在控制台一直输出null System.out.println("客户端说:"+st); } } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args){ try { Server a=new Server(); a.start();//启动程序 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客户端代码:
package day01; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; /** * 客户端 * @author TEDU * */ public class Client { private Socket socket; public Client(){ try { socket=new Socket("localhost",8098); System.out.println("连接服务器成功"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void start(){ try { OutputStream in=socket.getOutputStream(); OutputStreamWriter oi=new OutputStreamWriter(in,"UTF-8"); PrintWriter an=new PrintWriter(oi,true); String st="你好客户端"; an.println(st); socket.close();//如果不关闭socket会导致异常 } catch (Exception e) { } } public static void main(String[] args) { try { Client client=new Client(); client.start(); } catch (Exception e) { System.out.println("客户端启动失败"); } } }
二、通过控制台向服务端发消息
客户端代码:
(服务端代码不变)
package day01; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; /** * 客户端 * @author TEDU * */ public class Client { private Socket socket; Scanner scan; public Client(){ try { socket=new Socket("localhost",8098); System.out.println("连接服务器成功"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void start(){ try { System.out.println("开始聊天吧"); scan=new Scanner(System.in); while(true){ OutputStream in=socket.getOutputStream(); OutputStreamWriter oi=new OutputStreamWriter(in,"UTF-8"); PrintWriter an=new PrintWriter(oi,true); String st=scan.nextLine(); an.println(st); } } catch (Exception e) { } try { socket.close(); scan.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }//如果不关闭socket会导致异常 } public static void main(String[] args) { try { Client client=new Client(); client.start(); } catch (Exception e) { System.out.println("客户端启动失败"); } } }