要先打开服务器,然后才能连接客户端通信 1.服务器 package s122803可视化主机与客户端通信; //凡是网络通信相关,都要这2个包 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.*; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class Server extends JFrame implements ActionListener{ JTextArea jta=null; JButton jb=null; JTextField jtf=null; JPanel jp=null; JScrollPane jsp=null; PrintWriter pw=null; public Server() { //设置窗体属性************************************************************ jta=new JTextArea(); jb=new JButton("发送"); jb.addActionListener(this); // jtf=new JTextField(15); jp=new JPanel(); jp.add(jtf); jp.add(jb); jsp=new JScrollPane(jta); this.setTitle("服务器");//设置窗体的标题 this.setSize(400,300);//设置窗体的大小 this.setDefaultCloseOperation(3);//设置关闭的方式 this.setLocationRelativeTo(null);//设置窗体出现在屏幕中间 this.setResizable(false);//设置窗体不可改变大小 this.setLayout(new BorderLayout());//设置窗体为空布局 this.add(jsp,BorderLayout.CENTER); this.add(jp,BorderLayout.SOUTH); this.setVisible(true); //设置窗体属性************************************************************ try{ ServerSocket ss=new ServerSocket(9999); //设置服务器端口是9999 Socket s=ss.accept(); //监听是否有客户端登陆,只有为true才会执行下面的代码 //而且监听到的端口赋给s,s就表示连接的客户端端口 BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); /*s是客户端端口,s.getInputStream这个方法是获取客户端的输入流,从而获取客户端发送的数据 上面这一句可以写成2句话 InputStreamReader aa=new InputStreamReader(s.getInputStream()); BufferedReader br=new BufferedReader(aa); 将字节流放入缓冲池 */ pw=new PrintWriter(s.getOutputStream(),true); jta.setText("客户端已接入"+"\r\n"); String aa="已成功连接服务器"; pw.println(aa); while(true) { String xinxi=br.readLine(); jta.append("客户端:"+xinxi+"\r\n"); } } catch(Exception e){} } public static void main(String[] args) { new Server(); } public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("发送")) { String xinxi=jtf.getText(); jta.append("服务器:"+xinxi+"\r\n"); pw.println(xinxi); jtf.setText(""); } } } 2.客户端 package s122803可视化主机与客户端通信; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.awt.BorderLayout; import java.awt.event.*; import javax.swing.*; public class Client extends JFrame implements ActionListener { //声明各组件************************ JTextArea jta=null; JButton jb=null; JTextField jtf=null; JPanel jp=null; JScrollPane jsp=null; PrintWriter pw=null; //声明各组件************************ public static void main(String[] args) {new Client(); } public Client() { //设置窗体属性************************************************************ jta=new JTextArea(); //创建文本域对象 jb=new JButton("发送"); //创建按钮对象 jb.addActionListener(this); //给按钮添加事件源对象 jtf=new JTextField(15); //创建文本框对象 jp=new JPanel(); jp.add(jtf); jp.add(jb); //创建界面对象jp,在界面中添加文本框和按钮 jsp=new JScrollPane(jta); //在滚动条中添加文本域 this.setTitle("客户端"); //设置窗体的标题 this.setSize(400,300); //设置窗体的大小 this.setDefaultCloseOperation(3); //设置关闭的方式 this.setLocationRelativeTo(null); //设置窗体出现在屏幕中间 this.setResizable(false); //设置窗体不可改变大小 this.setLayout(new BorderLayout()); //设置窗体为空布局 this.add(jsp,BorderLayout.CENTER); //将面板jsp添加到窗体的中间区域 this.add(jp,BorderLayout.SOUTH); //将面板jp添加到窗体的下方区域 this.setVisible(true); //设置窗体可见 //设置窗体属性************************************************************ try{ Socket s=new Socket("127.0.0.1",9999); //服务器地址为127.0.0.1,端口号是9999 pw=new PrintWriter(s.getOutputStream(),true); //pw用来存要发送的信息 BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); /*s是客户端端口,s.getInputStream这个方法是获取客户端的输入流,从而获取客户端发送的数据 上面这一句可以写成2句话 InputStreamReader aa=new InputStreamReader(s.getInputStream()); BufferedReader br=new BufferedReader(aa); 将字节流放入缓冲池 */ while(true) { String xinxi=br.readLine(); //读取客户端发送的信息,读取一行 jta.append("服务器:"+xinxi+"\r\n"); //文本域显示读取到的信息 } } catch(Exception e){} } public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("发送")) //如果按钮被点击 { String xinxi=jtf.getText(); //得到文本框输入的内容 jta.append("客户端:"+xinxi+"\r\n"); //将输入的内容显示在文本域中 pw.println(xinxi); //将我要发送的信息发送出去 jtf.setText(""); //将文本框清空 } } }