Java的网络编程 Li.048
网络通信 ip 电脑地址 UDP TCP 端口号 socket 插座, 数据流间的插座, 用来联通 类似电脑是港口ip, socket是航线用来发货, 端口号是港口停放船的泊位, UDP TCP是小船还是大船来运送数据箱子 DatagramSocket 与 DatagramPacket DatagramSocket 创建一条航线 DatagramPacket 指定电脑ip(港口), 端口号(泊位), 运送的数据(集装箱) import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets; public class Demo1_Send { public static void main(String[] args) throws IOException { String msg = "中午一起吃饭"; DatagramSocket datagramSocket = new DatagramSocket(); DatagramPacket datagramPacket = new DatagramPacket (msg.getBytes(StandardCharsets.UTF_8),msg.getBytes().length, InetAddress.getByName("127.0.0.1"),2000); datagramSocket.send(datagramPacket); datagramSocket.close(); } } import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Demo2_Receive { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(2000); DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); socket.receive(packet); byte[] arr = packet.getData(); int len = packet.getLength(); System.out.println(new String(arr,0,len)); socket.close(); } } 能够不断录入的版本 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class Demo3_Send { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); DatagramSocket datagramSocket = new DatagramSocket(); while (true){ String msgLine = sc.nextLine(); if( "quit".equals(msgLine)){ break; } System.out.println(msgLine); DatagramPacket packet = new DatagramPacket (msgLine.getBytes(StandardCharsets.UTF_8), msgLine.getBytes().length, InetAddress.getByName("127.0.0.1"), 2000); datagramSocket.send(packet); } datagramSocket.close(); } } import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Demo3_Receive { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(2000); DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); while (true){ socket.receive(packet); byte[] arr = packet.getData(); int len = packet.getLength(); System.out.println("信息" + new String(arr,0,len)); } } } 多线程发送和接收信息 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class Demo4_MoreThread { public static void main(String[] args) { MyReceive myReceive = new MyReceive(); MySend mySend = new MySend(); myReceive.start(); mySend.start(); } } class MyReceive extends Thread{ @Override public void run() { try { DatagramSocket socket = null; socket = new DatagramSocket(2000); DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); while (true){ socket.receive(packet); byte[] arr = packet.getData(); int len = packet.getLength(); System.out.println("信息" + new String(arr,0,len)); } } catch (IOException e) { e.printStackTrace(); } } } class MySend extends Thread{ @Override public void run() { Scanner sc = new Scanner(System.in); DatagramSocket datagramSocket = null; try { datagramSocket = new DatagramSocket(); while (true){ String msgLine = sc.nextLine(); if( "quit".equals(msgLine)){ break; } DatagramPacket packet = new DatagramPacket (msgLine.getBytes(StandardCharsets.UTF_8), msgLine.getBytes().length, InetAddress.getByName("127.0.0.1"), 2000); datagramSocket.send(packet); } } catch (IOException e) { e.printStackTrace(); } datagramSocket.close(); } } GUI 聊天 import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; public class Demo5_GUIChat extends Frame{ private TextField textField; private TextArea viewText; private TextArea sendText; private Button send; private Button log; private Button clear; private Button shake; private DatagramSocket socket; // private BufferedReader br; private FileInputStream fis; private BufferedWriter bw; public Demo5_GUIChat() throws SocketException,IOException{ init(); southPanel(); centerPanel(); event(); Receive r = new Receive(); r.start(); this.setVisible(true); } public void event() { this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { try { bw.close(); } catch (IOException ex) { ex.printStackTrace(); } socket.close(); System.exit(0); } }); send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { send(); } catch (SocketException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } }); log.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { logFile(); } catch (IOException ex) { ex.printStackTrace(); } } }); clear.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { viewText.setText(""); } }); shake.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // shake(); try { send(new byte[]{-1},textField.getText()); } catch (IOException ex) { ex.printStackTrace(); } } }); sendText.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_ENTER ){ try { send(); } catch (IOException ex) { ex.printStackTrace(); } } } }); } public void shake(){ int x = this.getX(); int y = this.getY(); for(int i=0;i<20;i++){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } if(i % 2 == 0){ this.setLocation(x+3,y+3); } else { this.setLocation(x,y); } } } public void logFile() throws IOException { // br = new BufferedReader(new InputStreamReader(new FileInputStream("chat.log"))); // br = new BufferedReader(new FileReader("chat.log")); // viewText.setText(""); // int len ; // char [] arr = new char[1024]; // while ( ( len =br.read(arr)) != -1){ // viewText.append(new String(arr,0,len)); // } // br.close(); fis = new FileInputStream("chat.log"); ByteArrayOutputStream bos = new ByteArrayOutputStream(); int len; byte[] arr = new byte[8192]; while ( (len = fis.read(arr)) != -1){ bos.write(arr,0,len); } viewText.setText(bos.toString()); bos.close(); } public void send(byte[] arr,String ip) throws IOException { DatagramPacket packet = new DatagramPacket(arr, arr.length, InetAddress.getByName(ip), 9999); socket.send(packet); } public void send() throws IOException { String msg = sendText.getText(); if( "".equals(msg.trim()) || null ==msg){ return; } else { String ip = textField.getText(); if( ip.equals(null) || ip.trim().equals("")){ ip = "255.255.255.255"; } String time = getTime(); send(msg.getBytes(StandardCharsets.UTF_8),ip); String chatlog = time+" "+"我对:"+(ip.equals("255.255.255.255")? "所有人":ip)+"说:"+"\n"+ msg +"\n"+"\n"; viewText.append(chatlog); bw.write(chatlog); bw.flush(); sendText.setText(""); } } public String getTime(){ Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); return sdf.format(date); } public void centerPanel() { Panel center = new Panel(); viewText = new TextArea(); sendText = new TextArea(5,2); viewText.setEditable(false); viewText.setBackground(Color.WHITE); center.setLayout( new BorderLayout()); center.add(sendText, BorderLayout.SOUTH); center.add(viewText, BorderLayout.CENTER); sendText.setFont(new Font("xxx", Font.PLAIN,20)); viewText.setFont(new Font("xxx", Font.PLAIN,16)); this.add(center, BorderLayout.CENTER); } public void southPanel() { Panel south = new Panel(); textField = new TextField(15); textField.setText("127.0.0.1"); send = new Button("发送"); log = new Button("记录"); clear = new Button("清除"); shake = new Button("振动"); south.add(textField); south.add(send); south.add(log); south.add(clear); south.add(shake); this.add(south, BorderLayout.SOUTH); } private void init() throws IOException { this.setLocation(500,10); this.setSize(500,800); socket = new DatagramSocket(); // bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("chat.log",true))); bw = new BufferedWriter(new FileWriter("chat.log",true)); } public static void main(String[] args) throws SocketException,IOException { Demo5_GUIChat guiChat = new Demo5_GUIChat(); } private class Receive extends Thread{ //发送 接收同时进行 @Override public void run() { try { DatagramSocket socket = new DatagramSocket(9999); DatagramPacket packet = new DatagramPacket(new byte[8192], 8192); while (true){ socket.receive(packet); byte[] arr = packet.getData(); int length = packet.getLength(); if( length == 1 && arr[0] == -1){ shake(); continue; } String msg = new String(packet.getData(), 0, packet.getLength()); String chatlog = getTime()+" "+textField.getText()+" "+"对我说:"+"\n"+msg+"\n\n" ; viewText.append(chatlog); bw.write(chatlog); bw.flush(); } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } } TCP协议 (重要) TCP 三次握手 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class Demo2_Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(2000); Socket socket = server.accept(); InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); os.write("明天还上班不".getBytes(StandardCharsets.UTF_8)); byte[] arr = new byte[8192]; int len; len = is.read(arr); System.out.println(new String(arr,0,len)); } } import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.nio.charset.StandardCharsets; public class Demo1_Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.01",2000); InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); byte[] arr = new byte[8192]; int len = is.read(arr); os.write("吃了".getBytes(StandardCharsets.UTF_8)); System.out.println(new String(arr,0,len)); } } 服务端 客户端TCP 优化 import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class Demo2_Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(2000); Socket socket = server.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); OutputStream out; PrintStream ps = new PrintStream(socket.getOutputStream()) ; ps.println("快乐, 放假了"); System.out.println(br.readLine()); ps.println("出来玩吧"); System.out.println(br.readLine()); } } import java.io.*; import java.net.Socket; public class Demo2_Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.01",2000); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintStream ps = new PrintStream(socket.getOutputStream()) ; System.out.println( br.readLine()); ps.println("是的, 放假了"); System.out.println( br.readLine()); ps.println("起飞"); } } 服务增加多线程 import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Demo2_Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(2000); while (true){ final Socket socket = server.accept(); new Thread(){ @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); OutputStream out; PrintStream ps = new PrintStream(socket.getOutputStream()) ; ps.println("快乐, 放假了"); System.out.println(br.readLine()); ps.println("出来玩吧"); System.out.println(br.readLine()); } catch (IOException e) { e.printStackTrace(); } } }.start(); } } } 服务端反转字符并写给客户端 import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Demo3_Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(2000); while (true){ final Socket socket = server.accept(); new Thread(){ @Override public void run() { while (true){ try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintStream ps = new PrintStream(socket.getOutputStream()) ; StringBuilder sb = new StringBuilder( br.readLine()); ps.println(sb.reverse()); } catch (IOException e) { e.printStackTrace(); } } } }.start(); } } } import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.util.Scanner; public class Demo3_Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.01",2000); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintStream ps = new PrintStream(socket.getOutputStream()) ; Scanner sc = new Scanner(System.in); String s = null; while (true){ s = sc.nextLine(); ps.println(s); System.out.println( br.readLine()); } } } 上传文件到服务端 import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Demo4_Server_SaveFiles { public static void main(String[] args) throws IOException{ ServerSocket server = new ServerSocket(2000); while (true){ final Socket socket = server.accept(); new Thread(){ @Override public void run() { while (true){ try { InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); PrintStream ps = new PrintStream(socket.getOutputStream()) ; File dir = new File("update"); if(!dir.exists()){ dir.mkdir(); } String fileName = br.readLine(); System.out.println(fileName); File file = new File(dir, fileName); if( file.exists()){ ps.println("已存在"); return; }else { ps.println("不存在"); } byte[] arr = new byte[8192]; int len; FileOutputStream fos = new FileOutputStream(file); while ( ( len = is.read(arr)) != -1){ fos.write(arr,0,len); } fos.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }.start(); } } } import java.io.*; import java.net.Socket; import java.util.Scanner; public class Demo4_Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.01",2000); InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); PrintStream ps = new PrintStream(socket.getOutputStream()) ; Scanner sc = new Scanner(System.in); String s = null; int len; byte[] arr = new byte[8192]; while (true){ s = sc.nextLine(); File file = new File(s); if( !file.exists()){ System.out.println("文件不存在"); } else if( file.isDirectory()){ System.out.println("文件夹, 请重新输入文件"); } else if (file.isFile()){ ps.println(s); String flag = br.readLine(); if( "已存在".equals(flag)){ System.out.println(flag); return; } else { InputStream inputStream = new FileInputStream(file); while ( (len = inputStream.read(arr)) != -1){ ps.write(arr,0,len); } ps.flush(); } } } } }