Java socket聊天编程

来源:互联网 发布:笔记本触摸手写软件 编辑:程序博客网 时间:2024/05/17 09:08
原理



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() {@Overridepublic 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() {@Overridepublic 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();// }}}

原创粉丝点击