1、方案介绍
应用程序通过使用用于描述IP地址和端口的“套接字”-Socket向网络发出请求或应答网络请求。Socket和ServerSocket类库位于Java.net包中。前者是建立网络连接时使用的,后者则是用于服务端的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例可完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生级别差别。他们的工作是通过SocketImpl类及其之类完成的。
程序包括服务器和客户端。详细原理图如下所示:
2、程序运行
程序运行之前,我们需要知道服务器端主机所在网络的地址,使用cmd查看如下:
该IPv4地址是172.16.80.88,子网掩码为255.255.255.0,默认网关是172.16.80.254。我们将得到的IP改写入客户端的相应地方即可。打开程序后,服务器处于监听状态。
服务器端代码
package Server_Client; import javax.swing.*; import java.net.*; import java.lang.*; import java.awt.event.*; import java.io.*; public class Server { JTextArea jta=null; JTextField jtf=null; JButton jb=null; JScrollPane jsp=null; JPanel jpl=null; PrintWriter pw=null; public static void main(String[] args) { MyServer msv=new MyServer(); } public void MyServer(){ jta=new JTextArea(); jtf=new JTextField(20); jsp=new JScrollPane(jta); jb=new JButton("send"); jb.addActionListener(this); jpl=new JPanel(); this.add(jsp,"Center"); jpl.add(jtf); jpl.add(jb); this.add(jsp,"South"); this.setTitle("Server"); this.setSize(400,300); this.setVisible(true); try{ ServerSocket ss=new ServerSocket(6666);//服务器监听 Socket s=ss.accept(); InputStreamReader isr=new InputStreamReader(s.getInputStream()); BufferedReader br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); while(true) { String info=br.readLine();//读取信息 jta.append("客户端对服务器说:"+info+"\r\n"); } } catch(Exception e){ e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e){//如果按下发送按钮 if(e.getSource()==jb){ String info=jtf.getText(); jta.append("服务器对客户端说:"+info+"\r\n"); pw.println(info); jtf.setText(""); } } }
客户端代码
package Server_Client; import javax.swing.*; import java.net.*; import java.awt.event.*; import java.io.*; public class Client { JTextArea jta=null; JTextField jtf=null; JButton jb=null; JScrollPane jsp=null; JPanel jpl=null; PrintWriter pw=null; public static void main(String[] args) { MyClient met=new MyClient(); } public MyClient() { jta=new JTextArea(); jtf=new JTextField(20); jsp=new JScrollPane(jta); jb=new JButton("send"); jb.addActionListener(this); jpl=new JPanel(); this.add(jsp,"Center"); jpl.add(jtf); jpl.add(jb); this.add(jsp,"South"); this.setTitle("Client"); this.setSize(400,300); this.setVisible(true); try{ ServerSocket s=new ServerSocket("172.16.80.88",6666); InputStreamReader isr=new InputStreamReader(s.getInputStream()); BufferedReader br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); while(true) { String info=br.readLine();//读取从服务器发来的信息 jta.append("客户端对服务器说:"+info+"\r\n"); } } catch(Exception e){ e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e){ if(e.getSource()==jb){ String info=jtf.getText(); jta.append("客户端对服务器说:"+info+"\r\n"); pw.println(info); } } }
运行结果图如下: