`

Java socket聊天编程

 
阅读更多
原理



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


  • 大小: 29.6 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java socket网络编程的基础示例

    总的来说,Java Socket网络编程是构建网络应用的基础,无论是简单的文件传输、聊天应用,还是复杂的分布式系统,都离不开Socket的使用。通过理解和实践TCP和UDP的Socket编程,开发者能够更好地掌握网络通信的核心...

    Java Socket聊天室

    Java Socket聊天室是一种基于Java编程语言实现的网络通信应用,它利用了Socket接口来构建一个局域网内的多人聊天环境,类似于QQ群的功能。在这个项目中,开发者运用了多线程技术来处理并发的用户交互,同时利用...

    Java Socket 聊天通信演示代码

    Java Socket 是一种网络通信协议,它是Java编程语言中实现客户端-服务器模型的基础。Socket 提供了低级别的、面向连接的、双向通信的网络接口,允许应用程序通过网络进行数据传输。在本示例中,我们将深入探讨Java ...

    JAVA Socket 网络编程教程

    一个简单的聊天室系统就是一个使用Java Socket实现的典型例子,服务器端接收多个客户端的连接请求,每个客户端都可以发送消息给其他所有在线的客户端。 十、总结 Java Socket编程是构建网络应用的基础,掌握其原理...

    Java Socket 聊天程序(图形界面)

    实现Java Socket聊天多线程编程,图形化界面,多人聊天(群聊),私人聊天,是基于本地模拟的Java聊天程序。 Java Socket聊天程序是我用了三天的时间写出来,用Netbeans建的工程,图形化界面是Netbeans拖拉出来的,...

    java socket聊天室

    Java Socket聊天室是一种基于Java编程语言实现的网络通信应用,主要利用了Socket编程接口来创建客户端和服务器端的连接,从而实现数据的双向传输。在这个系统中,用户可以通过客户端发送消息,服务器端接收到消息后...

    完整的java socket聊天室

    总的来说,这个Java Socket聊天室项目是一个实用的学习资源,它涵盖了网络编程、多线程、GUI设计等多个Java核心技术,对于学习和理解Java网络编程非常有帮助。通过实际运行和修改代码,开发者可以深入理解网络通信的...

    java socket 聊天室

    Java Socket聊天室是一种基于Java网络编程技术实现的通信系统,主要使用了Socket接口来构建客户端与服务器端的连接。在这个项目中,用户通过控制台(console)进行交互,体验类似于简单的在线聊天室。以下是对这个Java...

    基于java socket网络编程实现的五子棋游戏,可多人在线玩耍,聊天

    本项目“基于Java Socket网络编程实现的五子棋游戏,可多人在线玩耍,聊天”正是这种技术的实际应用。 首先,我们来深入理解Java Socket编程。Socket是网络通信中的端点,它允许两台计算机(或者网络上的任何其他...

    基于java socket网络编程实现的简单模拟qq聊天的程序,可实现并发聊天

    Java Socket网络编程是Java语言中实现网络通信的基础,它提供了低级别的、面向连接的、...而本示例中的简单QQ聊天程序,主要是为了演示Java Socket的基本使用和并发处理,帮助初学者理解网络编程的基本概念和操作流程。

    java socket 聊天系统

    总的来说,Java Socket聊天系统结合了网络编程、多线程、文件传输等多个重要概念和技术。理解并掌握这些知识点,不仅可以构建出功能丰富的聊天应用,也为其他类型的网络服务奠定了基础。在实践中,我们需要不断优化...

    Java socket聊天室+窗口抖动

    总的来说,这个"Java socket聊天室+窗口抖动"项目涵盖了Java网络编程、多线程、用户界面设计等多个方面,是学习和实践Java技术的好素材。通过这个项目,开发者不仅可以深入了解Socket通信,还能提升GUI编程和多用户...

    Java Socket聊天和文件传输工具

    在这个"Java Socket聊天和文件传输工具"中,开发者利用Socket API创建了一个实用的工具,能够实现用户间的文本聊天功能以及文件的传输。虽然源代码未提供,但我们可以根据已知的信息探讨其背后的原理和技术要点。 1...

    java socket聊天程序,有界面

    总结来说,Java Socket聊天程序通过Java的网络编程接口实现了多用户间的点对点通讯,提供了丰富的用户界面,让用户可以方便地进行聊天交流。这样的程序设计不仅涉及网络编程,还涉及到GUI设计、多线程编程以及可能的...

    Java版socket编程实现带语音聊天和文件传送功能

    本资源是本人前面发过的一个局域网聊天工具的升级版。...代码保证可用,如有问题请留言,代码较规范,结构清晰,相信对学习java socket编程和swing界面开发的朋友有一定的帮助。 注:main函数在MainFrame类

    Java socket聊天程序 有界面

    通过学习和实践这个Java Socket聊天程序,你可以深入理解网络编程的基本原理,掌握多线程编程,以及如何将这些技术应用于创建用户友好的图形界面。这不仅对提升你的Java编程技能大有裨益,而且对于理解和开发其他...

    有关socket的编程代码(简单的聊天程序).rar_Socket编程 聊天_java socket 聊天

    本压缩包包含的"有关socket的编程代码(简单的聊天程序)"是一个基础的Java聊天程序示例,旨在帮助初学者理解如何使用Socket进行客户端与服务器端之间的数据交互。 在Java中,Socket类代表网络上的一个端点,而...

    Java聊天室程序,socket编程

    Java聊天室程序是基于Socket编程实现的,这是一种网络通信机制,允许两台计算机通过网络交换数据。在Java中,Socket类和ServerSocket类是实现这一功能的核心组件。本程序能够支持多人在线同时聊天,这意味着它涉及到...

    JavaTCP-Socket.zip_JAVA socket编程_java socket _socket 聊天

    本篇将深入探讨Java Socket编程及其在构建聊天应用中的应用。 首先,我们要了解TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保数据包按照顺序发送,并且在接收端按顺序接收,...

Global site tag (gtag.js) - Google Analytics