`
369540808
  • 浏览: 196851 次
文章分类
社区版块
存档分类
最新评论

Java Socket服务器与客户端实例

 
阅读更多

本实例采用生产者/消费者模式进行设计,源码中包含了详细的注释。为了方便测试将服务器放在一个Servlet里面启动,浏览器访问该Servlet时启动服务器监听

1. 服务器源码

package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//此处使用Servlet方式进行编写,方便进行测试,在应用启动的时候就打开一个线程去监听客户端请求
public class ServerServlet implements Servlet {
public void init(ServletConfig arg0) throws ServletException {
Handler handler = new Handler();
Thread thread = new Thread(handler);
thread.start();
}
//客户端连接线程池
private ExecutorService executor = Executors.newFixedThreadPool(20);
//客户端请求处理线程池,此处要注意客户请求是否有先后顺序、共享资源
private ExecutorService bizExecutor = Executors.newFixedThreadPool(1);
//创建一个阻塞队列保存客户的请求信息
public LinkedBlockingQueue<ClientInfo> queue = new LinkedBlockingQueue<ClientInfo>();
//保存客户请求信息实体
class ClientInfo{
private String xml;
private String ip;
public ClientInfo(String xml, String ip){
super();
this.xml = xml;
this.ip = ip;
}
public String getXml() {
return xml;
}
public void setXml(String xml) {
this.xml = xml;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
//服务器线程,监听客户端请求
class Handler implements Runnable{
public void run(){
//开启一个业务处理线程,处理客户端的请求
bizExecutor.submit(new BizHandler());
ServerSocket server = null;
try{
server = new ServerSocket(11480);
} catch(Exception e){
e.printStackTrace();
}
if(server != null){
System.out.println("服务器端口已打开");
while(true){
try{
Socket socket = server.accept();
//开启一个与客户端连接的线程
ProgressThread proThread = new ProgressThread(socket);
executor.submit(proThread);
} catch (Exception e){
e.printStackTrace();
}
}
}
}
}
//客户端连接线程
class ProgressThread implements Runnable{
private Socket socket;
public ProgressThread(Socket socket){
super();
this.socket = socket;
}
public void run(){
try{
StringBuilder sb = new StringBuilder();
InputStream is = socket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(is,"utf-8"));
String line = null;
//以行为单位读取数据,长连接时若无换行符将不能读出数据,只能在socket关闭时一次性得到数据
while((line = in.readLine()) != null){
if(line.trim().endsWith("/xml>")){
sb.append(line);
if(sb != null && !"".equals(sb.toString().trim())){
queue.put(new ClientInfo(sb.toString(),this.socket.getLocalAddress().toString()));
}
sb = new StringBuilder();
} else {
sb.append(line);
}
}
// //没有换行符的读取方式,需捕获connect reset异常
// while (true){
// try{
// char[] ch = new char[1024];
// int n = in.read(ch);
// System.out.println(new String(ch, 0, n));
// } catch(Exception e){
// System.out.println("客户端连接已关闭");
// break;
// }
// }
}catch(Exception e){
e.printStackTrace();
}
}
}
//客户请求信息处理线程
class BizHandler implements Runnable{
public void run(){
while(true){
try{
//取出阻塞队列中的信息处理
final ClientInfo info = queue.poll();
if(info == null){
Thread.sleep(5000);
} else {
writeData(info.getXml(),info.getIp());
}
} catch(Exception e){
e.printStackTrace();
}
}
}
public void writeData(String str1, String str2){
System.out.println(str1);
System.out.println(str2);
}
}
public void destroy() {
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
}
}
2. 测试客户端

package test;
import java.io.OutputStream;
import java.net.Socket;
public class ClientTest {
public static void main(String[] args) {
Socket socket;
try {
socket = new Socket("localhost", 11480);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("<xml>Hello</xml>\r\n".getBytes("utf-8"));
outputStream.flush();
System.out.println(socket);
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}


分享到:
评论

相关推荐

    java socket长连接客户端服务端(标准实例)

    java socket长连接客户端服务端(标准实例),准确无误,流行结构。

    Java基于socket实现的客户端和服务端通信功能完整实例

    主要介绍了Java基于socket实现的客户端和服务端通信功能,结合完整实例形式分析了Java使用socket建立客户端与服务器端连接与通信功能,需要的朋友可以参考下

    Java Socket编程服务器响应客户端实例代码

    主要介绍了Java Socket编程服务器响应客户端实例代码,具有一定借鉴价值,需要的朋友可以参考下

    java socket 长连接实例

    java socket 的长连接实例,服务器端支持多个客户端连接,服务器端支持客户端的掉线检测。多线程编程

    基于java的服务器端与客户端的即时通讯

    1.在服务器端通过指定一...2.在客户端通过规定一个主机和端口号创建一个Socket实例,连到服务器上。 3.服务器端在本地建立一个文本文件存储与客户端互传字符串的记录。 4.设计服务器端可以同时连接多个不同的客户端

    Java 的Socket支持功能所做的服务器和客户端的实例 2011 05 30

    (2)以JFrame方式作了Socket客户端,用户可以输入IP地址以端口号9999(可以修改)和服务器通讯。用户使用textArea多行编辑器与服务器通讯。以单独的一行taxend(可以修改)结束通讯。也就是说在一个Socket实现多行...

    在 Java 上实现的 Socket.IO 服务器 实时java框架

    该项目是Socket.IO服务器的开源 Java 实现。基于Netty服务器框架。 根据 Apache License 2.0 获得许可。 支持1.x - 4.x版本的Socket.IO 客户端 支持 xhr 轮询传输 支持websocket传输 支持命名空间和房间 支持ack...

    JAVA UDP客户端服务端编写实例.rar

    JAVA UDP客户端服务端编写实例,  byte[] buffer=new byte[256]; //缓冲区数组  DatagramSocket socket=new DatagramSocket(port);//实例化数据报Socket  DatagramPacket packet;  System.out.println(...

    android socket 编程实例

    android socket 编程实例 客户端是android应用程序, socket服务器端使用java作为服务器

    Android编程之客户端通过socket与服务器通信的方法

    本文实例讲述了Android编程之客户端通过socket与服务器通信的方法。分享给大家供大家参考,具体如下: 下面是一个demo,Android客户端通过socket与服务器通信。 由于Android里面可以完全使用java.io.*包和java.net.*...

    Java Socket实现的简单聊天室实例

    使用socket实现的简单聊天室功能,包含客户端和服务器端代码,可以通过本实例快速了解java中socket的使用方法

    Java实现UDP服务器和客户端模型.rar

    Java实现UDP服务器模型,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。比如客户端模型如下:  DatagramSocket socket=new DatagramSocket(); //实例化一个数据报Socket  ...

    Socket连接池的经典实例

    一个java socket连接池的典型实例 SocketClient,客户端测试类 SocketAdapter继承Socket类...StartupSocketServer,socket服务器端的主线程,负责监听端口,当有客户端接入则启动一个任务线程WorkThread,服务器端的工作线程

    Java源码包100个设计实例.zip

    Java Telnet客户端实例源码 Java zip压缩包查看程序源码.rar java 一个消息发布网站.rar Java 数字签名、数字证书生成源码.rar Java 版的酒店系统,貌似完整.rar Java 电梯模拟程序 v2.0.rar Java 组播组中发送和...

    Socket编程实例(java)

    java Socket编程实例 包括客户端代码和服务器端代码。

    java socket

    java socket 实例 创建服务器端套接字,接受来自客户端的连接请求 , 获取客户端套接字的输出流,获取客户端输入流,创建字符输入流接受键盘输入

    Java聊天程序服务端和客户端程序

    RunServer()方法中运行聊天服务,通过Socket 类的getInetAddress().getHostName() 方法获得主机名, 建立新的ChatHandler 对象实例, 在synchronized (clients)中取得与客户端的同步。内部类ChatHandler 继承了...

    基于Socket的分布计算实例java源代码

    1、供java socket编程的初学者学习使用,严禁用作作业抄袭和商业用途。若转载源代码,请注明原作者以及作者的博客地址。 2、TCPChatRoomServer(服务器端),TCPChatRoomClient(客户端) 3、开发环境:MyEclipse 6.0...

    Java TCPIP Socket编程 源码

    一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端,一般在TCP Socket编程中,客户端有多个,而服务器端只有一个,客户端TCP向服务器端TCP发送连接请求,服务器端的...

    JAVA上百实例源码以及开源项目源代码

    Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码...

Global site tag (gtag.js) - Google Analytics