今天小小的弄了一个全双工,加了一个简单的界面,还是能够基本完成相互发送信息的需求的
代码如下:
服务器端:
//简易全双工 package ServerTest3; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.*; import java.io.*; public class MyServer3 extends JFrame{ //先做一个简单的界面 JButton sendButton = new JButton("发送"); JTextField sendField = new JTextField(10); JTextArea showArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(showArea); JPanel sendPanel = new JPanel(); PrintWriter pw; public MyServer3(){ ActionListener sendActionListener = new ActionListener(){ public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String sendinfo = sendField.getText(); pw.println(sendinfo); sendField.setText(""); } }; sendButton.addActionListener(sendActionListener); sendPanel.add(sendField); sendPanel.add(sendButton); //为了更加像一个显示窗口 我让禁止在内容显示窗口的编辑 //屏蔽键盘事件或许更好些 不过小弟技术有限 showArea.setEditable(false); this.add(scrollPane); this.add(sendPanel,BorderLayout.SOUTH); this.setSize(300, 200); this.setTitle("服务器端"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); try { //监听本机端口9999 ServerSocket ss = new ServerSocket(9999); Socket s = ss.accept(); showArea.append("连接成功\n"); //PrintWriter必须要和Socket在一块哦 因为这俩个是联系在一起的 不然发不对地方的 //不过为了让下面的sendActionListener使用 //可以定义成全局变量 pw = new PrintWriter(s.getOutputStream(),true); //不断接收来自客户端的信息 InputStreamReader isr = new InputStreamReader(s.getInputStream()); BufferedReader br = new BufferedReader(isr); while(true){ String getinfo = br.readLine(); showArea.append("客户端发来信息:"+getinfo+"\n"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { // TODO Auto-generated method stub MyServer3 ms3 = new MyServer3(); } }
客户端:
//简易全双工 package ClientTest3; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.*; import java.io.*; public class MyClient3 extends JFrame{ //先做一个简单的界面 JButton sendButton = new JButton("发送"); JTextField sendField = new JTextField(10); JTextArea showArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(showArea); JPanel sendPanel = new JPanel(); PrintWriter pw; ; public MyClient3(){ //定义发送按钮的事件 ActionListener sendActionListener = new ActionListener(){ public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String sendinfo = sendField.getText(); pw.println(sendinfo); sendField.setText(""); } }; sendButton.addActionListener(sendActionListener); sendPanel.add(sendField); sendPanel.add(sendButton); //为了更加像一个显示窗口 我让禁止在内容显示窗口的编辑 //屏蔽键盘事件或许更好些 不过小弟技术有限 showArea.setEditable(false); this.add(scrollPane); this.add(sendPanel,BorderLayout.SOUTH); this.setSize(300, 200); this.setTitle("客户端"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); //连接本机端口9999 try { Socket s = new Socket("127.0.0.1",9999); showArea.append("连接成功\n"); pw = new PrintWriter(s.getOutputStream(),true); //接受来自服务器的信息 InputStreamReader isr = new InputStreamReader(s.getInputStream()); BufferedReader br = new BufferedReader(isr); while(true){ String getinfo = br.readLine(); showArea.append("服务器发来信息:"+getinfo+"\n"); } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } public static void main(String[] args) { // TODO Auto-generated method stub MyClient3 ms3 = new MyClient3(); } }
效果图: