转载

Java(3)基于GUI的网络编程<菜鸟期末复习>

先上代码

服务器端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()方法会阻塞线程,直到收到客户的呼叫。

原文  https://segmentfault.com/a/1190000022404380
正文到此结束
Loading...