项目已经做的差不多了,其中做了一个消息的转发功能,所以自己也写一个简单的例子看看
先一步步的来吧,先写好一个Socket的消息传输的原型来,再一步步的改进吧。
其实在这个基础上要中的东西还是很多的
1.客户端的登陆
2.客户端与服务端的断连后重连
3.消息的编解码
4.将传输改成由接收,发送,处理队列与接收,发送,处理线程来做
5.队列的超时机制
6.多线程安全
7.服务端收到消息可以进行群发或是转发
.....
问题还是很多,先放个简单的东西来做吧
Server原型
服务端主要是为了接收客户端发来的消息并把这个消息群发到每一个客户端去。所以设置了一个List以存入Socket
这里主要做的是在start()方法中开一个线程,让服务端通过这个线程进行进行监听客户端发来的消息并拿到这个Socket对像,其实这东西本不需要开一个线程去做,但是为了不在ss.accept()的时候让整个调用这个方法的主线程在那里等待,所以开了个线程去做,一但接到客户端的消息就把接收线程拉起
package demo;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;
public class Server {
private ServerSocket ss = null;
private List<Socket> list = new LinkedList<Socket>();
private class ReceiveThread extends Thread {
private Socket socket = null;
public ReceiveThread(Socket socket) {
super("ReceiveThread");
this.socket = socket;
}
@Override
public void run() {
InputStream in = null;
DataInputStream dis = null;
while (true) {
try {
sleep(50);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
if (socket == null || socket.isClosed()
|| !socket.isConnected()) {
continue;
}
try {
in = socket.getInputStream();
dis = new DataInputStream(in);
String readUTF = dis.readUTF();
System.out.println("receive client message :" + socket
+ " " + readUTF);
send(readUTF);
} catch (IOException e) {
try {
in.close();
dis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
list.remove(socket);
e.printStackTrace();
}
}
}
}
public void send(String msg) throws IOException {
for (int i = 0; i < list.size(); i++) {
Socket groupSocket = list.get(i);
OutputStream out = groupSocket.getOutputStream();
DataOutputStream dout = new DataOutputStream(out);
dout.writeUTF(msg);
dout.flush();
out.flush();
}
}
public class AcceptSocketThread extends Thread {
public AcceptSocketThread() {
super("AcceptSocketThread");
}
public void run() {
try {
ss = new ServerSocket(7788);
while (true) {
Socket socket = ss.accept();
list.add(socket);
new ReceiveThread(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void start() throws IOException {
new AcceptSocketThread().start();
}
public static void main(String[] args) throws Exception {
System.out.println("Server start ....");
new Server().start();
}
}
2.客户端Client
这个就比较简单了,只是为了发送消息和接收消息
package demo;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private Socket socket = null;
private class ReceiveThread extends Thread {
@Override
public void run() {
while (true) {
try {
InputStream in = socket.getInputStream();
DataInputStream din = new DataInputStream(in);
String readUTF = din.readUTF();
System.out.println("Server Send Message: " + readUTF);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public void start() throws IOException {
socket = new Socket(InetAddress.getByName("127.0.0.1"), 7788);
new ReceiveThread().start();
System.out.println("Client start ....\nPlease input message : ");
while (true) {
Scanner scaner = new Scanner(System.in);
String next = scaner.next();
OutputStream out = socket.getOutputStream();
DataOutputStream dout = new DataOutputStream(out);
dout.writeUTF(next);
// scaner.close();
dout.flush();
}
}
public static void main(String[] args) throws IOException {
System.out.println("client ...");
Client client = new Client();
client.start();
}
}
分享到:
相关推荐
Java Socket通信是Java编程语言中实现网络通信的基础组件,它提供了低级别的、面向连接的、双向的数据传输服务。在Java中,Socket类和ServerSocket类是进行网络通信的核心类。Socket用于客户端,它建立到服务器的...
Java编写的GUI简单Socket聊天源码小程序是一种基于Java语言实现的图形用户界面(GUI)通信应用,它利用了Socket编程模型来实现客户端与服务器端之间的实时通讯。在本程序中,用户可以通过友好的图形界面与远程对端...
在本文中,我们将深入探讨如何使用Java编程语言来构建一个简单的聊天系统原型。这个系统将为初学者提供一个良好的学习平台,了解网络编程、多线程以及Java Socket通信的基础知识。下面,我们将详细阐述实现这样一个...
6. **设计模式**:在系统设计中,可能会用到工厂模式创建Socket对象,单例模式管理服务器,观察者模式实现消息发布与订阅等。 7. **安全性**:Java提供SSL/TLS支持,可实现加密的网络通信,保护数据安全。此外,还...
2. Socket编程:Java中的Socket类是网络通信的基础,它提供了双向的、基于字节的通信通道,使得客户端和服务器之间可以进行数据交换。 3. 多线程:通过直接继承Thread类,实现多线程处理,确保多个客户端并发请求时...
本文将深入探讨如何在Android环境中利用JNI编写socket通信代码,以实现本地或远程应用程序间的网络连接。 首先,让我们了解JNI的基础。JNI提供了一种方式,让Java代码能够调用原生代码,反之亦然。这通常用于提高...
- Socket编程:Java中的Socket类用于创建服务器和客户端的连接,实现数据交换。 - 多线程:提高并发处理能力,保证多个用户可以同时进行聊天。 - Eclipse集成开发环境:提供便利的开发、调试工具,加速开发进程。 8...
2. **头文件生成**: 使用`javah`工具,根据Java类中的`native`方法生成C/C++的头文件,定义了Java方法的C/C++原型。 3. **实现本地方法**: 根据生成的头文件编写C/C++代码,实现这些方法。 4. **编译和链接**: 编译C...
在该TFTP原型中,客户端和服务器端通过Socket通信来实现文件的上传和下载。Socket是应用层与传输层之间的接口,允许应用程序发送和接收数据。在TCP协议下,Socket提供了连接、发送、接收和关闭等操作,确保了文件...
套接字:Java中的Socket是实现网络通信的关键组件,用于建立和管理客户端与服务端的连接。 Java:作为开发语言,Java为即时聊天系统的实现提供了强大支持。 综上所述,基于Java的即时聊天系统设计与实现涉及了...
论文中详细介绍如何使用Socket在Java中搭建服务器,实现消息的接收、转发及用户列表的更新。 2. **多线程处理**:为了提高系统的响应速度和并发能力,论文采用了多线程机制。通过直接继承Thread类,可以独立处理每...
在Java中实现即时通讯,通常会涉及到以下几个关键技术点: 1. **网络编程基础**:Java的`Socket`类和`ServerSocket`类是进行网络通信的基础。`ServerSocket`用于监听客户端连接,`Socket`则用于建立客户端与服务器...
2. **Socket编程**:Socket是Java中的网络通信基础,它为应用程序提供了低级别的网络通信接口。在即时聊天系统中,Socket用于在服务器端和客户端之间建立连接,传输数据。服务器端通过监听特定端口,等待客户端的...
10. 关键字和搜索:在网络聊天系统的设计与实现中,系统开发者需要熟悉和运用各种技术关键字,例如LAN(局域网)、Chat(聊天)、Socket、Java等,这些关键字有助于在开发过程中查找相关信息和技术解决方案。...
【基于JAVA的聊天系统设计与实现】 随着互联网的迅速发展,网络聊天系统已经成为人们日常生活中不可或缺的交流平台。本文将探讨一个基于JAVA的聊天系统的设计与实现,它涵盖了网络编程的基础理论,包括TCP/IP协议、...
在JNI中,需要定义C/C++函数,并在对应的`.c`或`.cpp`文件中实现。同时,需要在Java源码中声明这些函数,并使用`native`关键字。然后使用`javah`工具生成对应的头文件,该头文件包含了JNI函数的原型。 6. **数据...