先上代码
服务器端Server:
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.*; public class SeverFrame implements ActionListener{ ServerSocket server; Socket s; Frame mainFrame=new Frame("Sever"); //主框架 Panel p1=new Panel(); TextField tfPort=new TextField("5000",40); //端口号文本框 Button btnListen=new Button(" Listen "); //监听按钮 TextArea taMSG=new TextArea(6,50); //接收消息文本框 Panel p2=new Panel(); TextField tfSend=new TextField(50); //向客户端发送消息文本框 Button btnSend=new Button(" Send "); //发送按钮 public SeverFrame() { //无参构造函数 mainFrame.add(p1,"North"); btnListen.addActionListener(this); p1.add(new Label("Port:"));p1.add(tfPort);p1.add(btnListen); mainFrame.add(taMSG,"Center"); mainFrame.add(p2,"South"); btnSend.addActionListener(this); p2.add(new Label("Server-Speak:"));p2.add(tfSend);p2.add(btnSend); mainFrame.pack(); mainFrame.setVisible(true); } public static void main(String/[/] args) { new SeverFrame(); } class ServerRecvThread extends Thread{ //服务端接收客户端的线程 Socket s; public ServerRecvThread(Socket s) { this.s=s; } @Override public void run() { //重写run方法 try { InputStream is=s.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(is)); String hear=reader.readLine(); //读一行文本 while(!"bye".equals(hear)) { taMSG.append("The client says:"+hear+"//n"); hear=reader.readLine(); } } catch (IOException e) { e.printStackTrace(); } } } @Override public void actionPerformed(ActionEvent e) { //实现事件监听 try { //获得事件源对象 Object eventSource=e.getSource(); //按下监听按钮 if(eventSource==btnListen) { int port=Integer.parseInt(tfPort.getText()); //string类型转换为int型 server=new ServerSocket(port); taMSG.append("ServerSocket is listening on "+port+"//n"); s=server.accept(); //ServerSocket开始监听 taMSG.append("A client is connected!//n"); Thread t=new ServerRecvThread(s); t.start(); //sever线程开始 }else if(eventSource==btnSend) { //按下发送按钮,向客户端发送消息 String send=tfSend.getText(); if(send.equals(""))return; OutputStream os=s.getOutputStream(); BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(os)); writer.write(send);writer.newLine(); writer.flush(); } } catch (IOException e1) { e1.printStackTrace(); } } }
客户端Client:
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.*; public class ClientFrame implements ActionListener{ Socket s; Frame mainFrame=new Frame("Client"); //主框架 Panel p1=new Panel(); TextField tfIP=new TextField("127.0.0.1",15); //IP地址文本框 TextField tfPort=new TextField("5000",15); //端口号文本框 Button btnConnect=new Button(" Connect "); //连接服务器按钮 TextArea taMSG=new TextArea(6,50); //接收消息文本框 Panel p2=new Panel(); TextField tfSend=new TextField(50); //发送消息文本框 Button btnSend=new Button(" Send "); //发送消息按钮 public ClientFrame() { //无参构造函数 mainFrame.add(p1,"North"); btnConnect.addActionListener(this); p1.add(new Label("服务器IP:"));p1.add(tfIP); p1.add(new Label("Port:"));p1.add(tfPort);p1.add(btnConnect); mainFrame.add(taMSG,"Center"); mainFrame.add(p2,"South"); btnSend.addActionListener(this); p2.add(new Label("Client-Speak:"));p2.add(tfSend);p2.add(btnSend); mainFrame.pack(); mainFrame.setVisible(true); } public static void main(String/[/] args) { new ClientFrame(); } class ClientRecvThread extends Thread{ //实现客户端接收服务器的线程 Socket s; public ClientRecvThread(Socket s) { this.s=s; } @Override public void run() { //重写run方法 try { InputStream is=s.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(is)); String hear=reader.readLine(); while(!"bye".equals(hear)) { taMSG.append("The server says:"+hear+"//n"); hear=reader.readLine(); } } catch (IOException e) { e.printStackTrace(); } } } @Override public void actionPerformed(ActionEvent e) { //实现事件监听 try { //获得事件源对象 Object eventSource=e.getSource(); if(eventSource==btnConnect) { //按下连接按钮,连接服务器 String ip=tfIP.getText(); String port=tfPort.getText(); s=new Socket(ip,Integer.parseInt(port)); taMSG.append("A server is connected!//n"); Thread t=new ClientRecvThread(s); t.start(); //开始client线程 }else if(eventSource==btnSend) { //按下发送按钮,向服务器发送消息 String send=tfSend.getText(); if(send.equals(""))return; OutputStream os=s.getOutputStream(); BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(os)); writer.write(send);writer.newLine(); writer.flush(); } } catch (IOException e1) { e1.printStackTrace(); } } }
(一)Socket编程
1、套接字概述:
网络通信使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序)。端口号规定为一个16位的0~65535之间的整数,其中0~1023被预先定义的服务通信占用。
2、两个主要的类(Socket,ServerSocket):
Socket:Socket是“IP地址 + 端口号”,组合成一个Socket对象,即客户端。ServerSocket:作用是创建一个监听服务(电话接线员),即服务器端。
理解:客户(Socket)想要去邮局办理特快邮寄业务,已知办理此业务在8号窗口。到达8号窗口后,一位业务员(ServerSocket)正在等待客户办理业务。
Socket s = new Socket(“127.0.0.1”,5000);//一个客户 ServerSocket server = new ServerSocket(5000);//一个业务员 Socket sc = server.accept();//服务开始
ServerSocket对象调用accept()方法会返回一个和客户端Socket对象相连接的Socket对象sc。sc调用getOutputStream()获得一个输出流指向客户端的输入流(向客户端发消息),sc调用getInputStream()获得一个输入流指向客户端的输出流(收客户端的消息)。
ps.accept()方法会阻塞线程,直到收到客户的呼叫。