2022年06月30日讲到了网络编程 同学们
目录
1. 聊天窗口
我们来写一个聊天窗口
public class UDPChat { // 这是我们的聊天窗口类 // 在JAVA的界面应用开发中 主要使用java.awt.* java.swing.* 这两个包下面的类 public UDPChat() { // 建立一个窗口 JFrame frame=new JFrame("UDP聊天窗口"); frame.setSize(800,600); // 设置窗口不可拉伸 frame.setResizable(false); // 设置窗口在中间出现 frame.setLocationRelativeTo(null); // 使用绝对布局 放入组件时需要确定组件的位置 frame.setLayout(null); // 加一个文本域 JTextArea show = new JTextArea(); // 设置文本域的字体 Font font = new Font("楷体",Font.PLAIN,25); show.setFont(font); // 设置文本域只能读 不能改 show.setEditable(false) // 加一个滚动条 JScrollPane pane = new JScrollPane(show,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); // 这里请不要把pane设置得和界面一样宽 留一点给滚动条 pane.setBounds(0,0,785,400); frame.add(pane); // 创建一个按钮 JButton close=new JButton("关闭"); close.setBounds(600,520,80,30); JButton send=new JButton("发送"); send.setBounds(700,520,80,30); Font btnFont = new Font("微软雅黑",Font.PLAIN,15); close.setFont(btnFont); send.setFont(btnFont); // 这个文本域用于输入 JTextArea input = new JTextArea(); input.setBounds(0,410,794,100); input.setBorder(BorderFactory.createLineBorder(Color.black)); input.setFont(btnFont); frame.add(input); frame.add(close); frame.add(send); // 如果需要给按钮添加功能 就需要加点击事件监听器 send.addActionListener(new ActionListener() { private DatagramSocket socket=null; private InetAddress address=null; { try { socket= new DatagramSocket(); // 这个是广播地址 address=InetAddress.getByName("192.168.74.255"); } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) {// 事件对象 new UDPThread(show).start(); String msg = input.getText(); byte[] bytes=msg.getBytes(); DatagramPacket packet=new DatagramPacket(bytes,bytes.length,address,8000); // 要将信息进行打包发送 try { socket.send(packet); } catch (IOException ioException) { ioException.printStackTrace(); } input.setText(""); } }); // 加上这个方法 窗口才能显示出来 frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) throws Exception{ new UDPChat(); } }
public class UDPThread extends Thread { // 这是我们的聊天线程类 private JTextArea area = null; public UDPThread(JTextArea area) { this.area = area; } @Override public void run() { try { DatagramSocket socket = new DatagramSocket(8000); byte[] data = new byte[1024]; DatagramPacket packet = new DatagramPacket(data, data.length); while (true) { socket.receive(packet); String ip = packet.getAddress().getHostAddress(); String msg = new String(data, 0, packet.getLength()); if ("over".equals(msg)) { area.append(ip + ":退出聊天室"); break; } else { System.out.println(ip + ":" + msg); area.append(ip + ":" + msg + "\n"); } } socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
写出来的界面是这样的:
2.使用TCP进行通讯
据说TCP比UDP可靠一些
我们用TCP复制一个docx文件
public class FileUploadServer { // 这是我们的服务端 就是发数据的 public FileUploadServer() { try { // 常见服务端Socket ServerSocket server = new ServerSocket(8000); Socket socket = server.accept(); System.out.println("接收到一个服务端的连接"); // 读取客户端 InputStream input=socket.getInputStream(); // 这里写复制好的文件放在哪里 OutputStream output = new FileOutputStream("file./学生激活.docx"); byte[] bytes=new byte[1024]; int size=-1; while ((size=input.read(bytes))>-1){ output.write(bytes,0,size); } System.out.println("上传成功"); output.close(); server.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { new FileUploadServer(); } }
public class FileUploadClient { // 这是我们的客户端 就是收数据的 public FileUploadClient() { try { // 创立链接 Socket socket = new Socket("192.168.74.30",8000); // 读取本地文件 就是写要复制的文件 File file = new File("D:/JAVA文档/学生激活.docx"); FileInputStream input = new FileInputStream(file); OutputStream output = socket.getOutputStream(); byte[] bytes = new byte[1024]; int size=1; while ((size=input.read(bytes))>0){ output.write(bytes,0,size); } // 文件上传结束后 告知服务器 socket.shutdownOutput(); input.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { new FileUploadClient(); } }
同样是先运行服务端 再运行客户端
THE END