socket的类型:
TCP:流式socket,SOCK_STREAM
可靠、双向、面向字节流
UDP:数据报式socket, SOCK_DGRAM
相关的系统调用:
socket(): 创建一个新的socket
bind():绑定于一个套接字地址上
listen(): 监听套接字
accept(): 接收连接请求
connect(): 发起连接请求
close(): 关闭连接
read()和write(): recv(), send(), recvfrom(), sendto()
1.TCP通信
server
package com.socket; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; public class SocketServer{ private PrintWriter pw; private JFrame frame; private JPanel pane_buttom; private JSplitPane pane_center; //显示内容的文本框,输入内容的文本框,发送内容按钮 private JScrollPane pane_showWindow; private JScrollPane pane_inputWindow; private JTextArea area_showWindow; private JTextArea area_inputWindow; private JButton btn_send; private Dimension dimension;//用于设置area_showWindow可拖拉的大小 //初始化 public SocketServer() { frame = new JFrame(); pane_buttom = new JPanel(); pane_showWindow = new JScrollPane(); pane_inputWindow = new JScrollPane(); area_showWindow = new JTextArea(); area_inputWindow = new JTextArea(); pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, pane_showWindow, pane_inputWindow); btn_send = new JButton("发送"); dimension = new Dimension(50, 300); } //调用方法显示窗口 public void showFrame(){ initFrame(); initChatTextArea(); initButton(); btn_send(); socket(); } //主窗体 public void initFrame(){ frame.setTitle("服务端"); int width = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth(); int height = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight(); frame.setBounds(width / 2, height / 2, 400, 450); frame.setVisible(true); } //内容显示文本框和输入内容文本框 private void initChatTextArea(){ //取得视图焦点 pane_showWindow.getViewport().add(area_showWindow); pane_inputWindow.getViewport().add(area_inputWindow); //将显示文本域设置为不可编辑 area_showWindow.setEditable(false); //设置显示文本域可拖拉的大小 pane_showWindow.setMinimumSize(dimension); frame.add(pane_center, BorderLayout.CENTER); } //发送文件,发送内容按钮 public void initButton(){ pane_buttom.add(btn_send); frame.add(pane_buttom, BorderLayout.SOUTH); } private void btn_send(){ btn_send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String info = area_inputWindow.getText(); area_showWindow.append("服务端:"+info+"\r\n"); pw.println(info); area_inputWindow.setText(""); } }); } private void socket(){ ServerSocket ss; try { ss = new ServerSocket(9988); //等待连接 客户端 Socket s=ss.accept(); InputStreamReader isr=new InputStreamReader(s.getInputStream()); BufferedReader br=new BufferedReader(isr); //PrintWriter必须和socket有密切的关系 把写入的数据传到socket对应的OutputStream中 pw=new PrintWriter(s.getOutputStream(),true); //读取从客户端法发来的信息 while(true) { //读取从客户端发来的信息 String info=br.readLine(); //在文本栏里显示 area_showWindow.append("客户端:"+info+"\r\n"); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { SocketServer chat = new SocketServer(); chat.showFrame(); } }
client
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; public class Test { private PrintWriter pw; private JFrame frame; private JPanel pane_buttom; private JSplitPane pane_center; // 显示内容的文本框,输入内容的文本框,发送内容按钮 private JScrollPane pane_showWindow; private JScrollPane pane_inputWindow; private JTextArea area_showWindow; private JTextArea area_inputWindow; private JButton btn_send; private Dimension dimension;// 用于设置area_showWindow可拖拉的大小 // 初始化 public Test() { frame = new JFrame(); pane_buttom = new JPanel(); pane_showWindow = new JScrollPane(); pane_inputWindow = new JScrollPane(); area_showWindow = new JTextArea(); area_inputWindow = new JTextArea(); pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, pane_showWindow, pane_inputWindow); btn_send = new JButton("发送"); dimension = new Dimension(50, 300); } // 调用方法显示窗口 public void showFrame() { initFrame(); initChatTextArea(); initButton(); btn_send(); socket(); } // 主窗体 public void initFrame() { frame.setTitle("客户端"); int width = (int) Toolkit.getDefaultToolkit().getScreenSize() .getWidth(); int height = (int) Toolkit.getDefaultToolkit().getScreenSize() .getHeight(); frame.setBounds(width / 2, height / 2, 400, 450); frame.setVisible(true); } // 内容显示文本框和输入内容文本框 private void initChatTextArea() { // 取得视图焦点 pane_showWindow.getViewport().add(area_showWindow); pane_inputWindow.getViewport().add(area_inputWindow); // 将显示文本域设置为不可编辑 area_showWindow.setEditable(false); // 设置显示文本域可拖拉的大小 pane_showWindow.setMinimumSize(dimension); frame.add(pane_center, BorderLayout.CENTER); } // 发送文件,发送内容按钮 public void initButton() { pane_buttom.add(btn_send); frame.add(pane_buttom, BorderLayout.SOUTH); } private void btn_send() { btn_send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String info = area_inputWindow.getText(); area_showWindow.append("客户端: " + info + "\r\n"); pw.println(info); area_inputWindow.setText(""); } }); } //处理消息 @SuppressWarnings("all") private void socket() { try { Socket socket = new Socket("127.0.0.1", 9988); InputStreamReader isr = new InputStreamReader(socket.getInputStream()); BufferedReader br = new BufferedReader(isr); //PrintWriter必须和socket有密切的关系 pw = new PrintWriter(socket.getOutputStream(), true); while (true) { // 不停地读取从服务器端发来的信息 String info = br.readLine(); area_showWindow.append("服务端: " + info + "\r\n"); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { Test chat = new Test(); chat.showFrame(); } }
2.UDP通信
server
package com.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class SocketServer { public static void main(String[] args) { //TCP通信 // ServerSocket serverSocket = null ; // try { // serverSocket = new ServerSocket(3000); // Socket socket = serverSocket.accept(); // InputStream inputStream = socket.getInputStream(); // byte[] byt = new byte[1024]; // int length = 0; // // 开始读取 // while ((length = inputStream.read(byt)) != -1) { // System.out.println(new String(byt,0,length)); // } // } catch (Exception e) { // } //UDP通信 try { DatagramSocket serverSocket = new DatagramSocket(3000); byte[] byt = new byte[1024]; DatagramPacket packet = new DatagramPacket(byt, byt.length); serverSocket.receive(packet); System.out.println(new String(packet.getData())); serverSocket.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
client
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Test { public static void main(String[] args) { // Socket socket = null ; // try { // socket = new Socket("192.168.1.192", 3000); // OutputStream outputStream = socket.getOutputStream(); // InputStream inputStream = new FileInputStream("D:123.txt"); // byte[] byt = new byte[1024]; // int length = 0; // // 开始读取 // while ((length = inputStream.read(byt)) != -1) { // outputStream.write(byt,0,length); // } // inputStream.close(); // } catch (Exception e) { // } try { DatagramSocket socketClient = new DatagramSocket(3001); InetAddress address = InetAddress.getByName("192.168.1.192"); byte[] content = "Just test".getBytes(); DatagramPacket packet = new DatagramPacket(content, content.length,address,3000); socketClient.send(packet); socketClient.close(); } catch (Exception e) { e.printStackTrace(); } } }
3.聊天
server
package com.socket; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /** * @author: * @TODO:Socket服务端 */ public class SocketServer { public static void main(String[] args) { // TCP通信 ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(3000); Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); byte[] byt = new byte[1024]; int length = 0; // 开始读取 while ((length = inputStream.read(byt)) != -1) { System.out.println(new String(byt, 0, length)); } } catch (Exception e) { } // UDP通信 // try { // DatagramSocket serverSocket = new DatagramSocket(3000); // byte[] byt = new byte[1024]; // DatagramPacket packet = new DatagramPacket(byt, byt.length); // serverSocket.receive(packet); // System.out.println(new String(packet.getData())); // serverSocket.close(); // } catch (SocketException e) { // e.printStackTrace(); // } catch (IOException e) { // e.printStackTrace(); // } } }
client
import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class Test { public static void main(String[] args) { Socket socket = null; InputStream inputStream = null; Scanner scanner = new Scanner(System.in); String content = ""; try { socket = new Socket("192.168.1.192", 3000); while (!(content = scanner.nextLine()).equals("exit")) { OutputStream outputStream = socket.getOutputStream(); inputStream = new ByteArrayInputStream(content.getBytes()); byte[] byt = new byte[1024]; int length = 0; // 开始读取 while ((length = inputStream.read(byt)) != -1) { outputStream.write(byt, 0, length); } } scanner.close(); inputStream.close(); } catch (Exception e) { } // try { // DatagramSocket socketClient = new DatagramSocket(3001); // InetAddress address = InetAddress.getByName("192.168.1.192"); // byte[] content = "Just test".getBytes(); // DatagramPacket packet = new DatagramPacket(content, // content.length,address,3000); // socketClient.send(packet); // socketClient.close(); // } catch (Exception e) { // e.printStackTrace(); // } } }