Socket通信:分为客户端和服务端的socket代码。

Java SDK提供一些相对简单的Api来完成.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以开始网络编程了。

  网络编程的基本模型就是客户机到服务器模型。简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。了解这个简单的模型,就可以网络编程了。 Java对这个模型的支持有很多种Api。而这里我只想介绍有关Socket的编程接口,对于Java而言已经简化了Socket的编程接口。

创建服务器端实例有四种构造函数可以实现(Java提供了ServerSocket来对其进行支持):  

  

首先,我们来讨论有关提供固定位置的服务方是如何建立的。事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你。

ServerSocket server=new ServerSocket(int port);  //port - 端口号;或者为 0,表示使用任何空闲端口。

这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。

创建绑定到特定端口的服务器套接字。端口 0 在所有空闲端口上创建套接字。输入连接指示(对连接的请求)的最大队列长度被设置为 50。如果队列满时收到连接指示,则拒绝该连接。

其次,创建非绑定服务器。

ServerSocket server=new ServerSocket();  //创建非绑定服务器套接字

  

第三,创建指定端口,最大连接数的服务器。

ServerSocket server=new ServerSocket(int port,int backlog); //port - 指定的端口;或者为 0,表示使用任何空闲端口。backlog - 队列的最大长度。

利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。端口号 0 在所有空闲端口上创建套接字。输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数。如果队列满时收到连接指示,则拒绝该连接。backlog 参数必须是大于 0 的正值。如果传递的值等于或小于 0,则假定为默认值。

  

第四,创建指定端口,最大连接数,指定IP的服务器。

ServerSocket server=new ServerSocket(int port,int backlog,InetAddress bindAddr);//port - 本地 TCP 端口;backlog - 侦听
//backlog;bindAddr - 要将服务器绑定到的 InetAddress

使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。bindAddr 参数可以在 ServerSocket 的多穴主机 (multi-homed host) 上使用,ServerSocket 仅接受对其地址之一的连接请求。如果 bindAddr 为 null,则默认接受任何/所有本地地址上的连接。端口必须在 0 到 65535 之间(包括两者)。

服务器端实例创建完成以后,就可以使用线程池来处理客户端发来的请求数据了。

ExecutorService pool = Executors.newFixedThreadPool(int poolSize); //poolSize 固定线程池大小

下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 Executors.newFixedThreadPool(int) 工厂方法:

ServerThread.java

public class ServerThread extends Thread //此处亦可以实现Runnable接口
{
private InputStream ins = null;
private PrintWriter out = null; public ServerThread(Socket socket)
{
try
{
ins = socket.getInputStream();
out = new PrintWriter(socket.getOutputStream(), true);
socket.setSoTimeout(1000);
}
catch (IOException e)
{
e.printStackTrace();
interrupt(); // 如果发生异常 则终止线程
}
} public void run()
{
try
{
// 初始化构造函数以后会执行到这里
//从输入流中取出数据并转换成字符串格式
//处理客户端请求过来的相应数据,并做处理
String instr = "";
int temp = -1;
List<Byte> byteList = new ArrayList<Byte>();
while(true)
{
try
{
temp = ins.read();
if(temp != -1)
{
byteList.add(new Byte((byte)temp));
}
else
{
break;
}
}
catch (IOException e)
{
break;
}
} byte[] bytes = new byte[byteList.size()];
for(int i=0;i<byteList.size();i++)
{
bytes[i] = byteList.get(i);
} instr = new String(bytes);//将byte数组类型转换为字符串
System.out.println("the content of recivedMessage is:" + instr); // 这里用日志文件记录下收到的报文
out.println("Request Message has been receiver!");
out.flush();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}

ServerSocketDemo.java

public class ServerSocketDemo extends Thread
{
private ServerSocket server = null;
private int port = 0;
private int poolsize = 0;
private int maxconn = 0; public ServerSocketDemo(int port, int poolSize,int maxconn)
{
System.out.println("port is:>>>>>>"+port);
System.out.println("poolSize is:>>>>>>"+poolSize);
System.out.println("maxconn is:>>>>>>"+maxconn); this.port = port;
this.poolsize = poolSize;
this.maxconn = maxconn;
} public void run()
{
try
{
System.out.println("the poolsize is:>>>>" + poolsize);
System.out.println("the port is:>>>>" + port);
System.out.println("the maxconn is:>>>>" + maxconn);
// 使用固定大小线程池
ExecutorService thredpool = Executors.newFixedThreadPool(poolsize);
server = new ServerSocket(port, maxconn);
server.setSoTimeout(0); // 设置不会超时
System.out.println("socket listener start!the port is:>>>>" + port
+ " and the maxConn number is:" + maxconn
+ "and the Thread Pool size is" + poolsize); while (true)
{
thredpool.execute(new ServerThread(server.accept()));
System.out.println("a ServerThread has been started!");
}
}
catch (Exception e)
{
// 这里要用日志文件记录异常
System.out.println(
"The serversocket listener exception occurred! the exception msg is>>>>"
+ e.getMessage());
}
}
}

ServerSocketTest.java

public class ServerSocketTest {

    /**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub ServerSocketDemo ssd = new ServerSocketDemo(9997,50,100);
ssd.start();
} }

Java Socket网络编程Server端详解的更多相关文章

  1. Java Socket网络编程Client端详解

    此类实现客户端套接字(也可以就叫“套接字”).套接字是两台机器之间的通信端点. Socket client = new Socket(ip,port);//创建一个流套接字并将其连接到指定 IP 地址 ...

  2. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  3. Java Socket网络编程的经典例子(转)

    事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作.Socket ...

  4. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)

    目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...

  5. Java Socket网络编程学习笔记(一)

    0.前言 其实大概半年前就已经看过网络编程Socket的知识了(传统IO),但是因为长时间的不使用导致忘的一干二净,最近正好准备校招,又重新看了网络编程这一章, 是传统IO(BIO)相关的内容,故在此 ...

  6. java socket网络编程(多线程技术)

    Client.java import java.io.*; import java.net.*; import java.util.*; public class Client { public st ...

  7. java socket 网络编程常见异常

    1.java.net.SocketTimeoutException 这个异常比较常见,socket超时.一般有2个地方会抛出这个,一个是connect的时候,这个超时参数由connect(Socket ...

  8. Java Socket网络编程常见异常(转)

    1.java.net.SocketTimeoutException 这个异常比较常见,socket超时.一般有2个地方会抛出这个,一个是connect的时候,这个超时参数由connect(Socket ...

  9. Java - TCP网络编程

    Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...

随机推荐

  1. How to make a combo box with fulltext search autocomplete support?

    I would like a user to be able to type in the second or third word from a TComboBoxitem and for that ...

  2. 【转载】利用Matlab制作钟表

    静态时钟 hObject=figure; set(hObject,'NumberTitle','off'); set(hObject,'MenuBar','none'); set(hObject,'v ...

  3. Facebook产品的开发流程

    [编者注]王淮是Facebook第二位中国籍工程师,也是第一位中国籍研发经理,他一手开创了Facebook的支付安全和客服工具领域.2011年他离开Facebook,回国成为天使投资人,希望用自己在F ...

  4. Powerdesigner数据库建模--概念模型--ER图

    目标: 本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念. 一.概念数据模型概述 数据模型是现实世界中数据特征的抽象.数据模型应该满足三个方面的要求: 1)能够比较真实地模拟现实 ...

  5. Hive配置与操作实践

    Hive配置与操作实践 @(Hadoop) 安装hive hive的安装十分简单,只需要在一台服务器上部署即可. 上传hive安装包,解压缩,将其配入环境变量. mysql的设置 在要作为元数据库的m ...

  6. Asp.net 在网页编写C#代码示例-- 一个简单的web MsSql 命令执行环境

    在给一个客户做的系统上,因为要对数据库进行查看,但之前都是用TeamView来连接到客户的服务器进行数据库操作的 但最近客户那边的TeamView好像更改过密码导致我无法正常连接,而巧了客户的网官因为 ...

  7. ActiveReport开发入门-列表的交互性

    Cognos10以来推出了Active Report,和很多人一样,怀着一颗好奇的心,准备接纳和了解一下这个新生儿,于是乎便有了下面的故事. 1:新建一个活动报表,两行一列拖入一个按钮栏和一个列表 2 ...

  8. SpringMVC基于代码的配置方式(零配置,无web.xml)直接继承WebMvcConfigurerAdapter

    基于配置文件的web项目维护起来可能会更方便,但是有时候我们会有一些特殊的需求,比如防止客户胡乱更改配置,这时候我们需要给配置隐藏到代码中. 1.创建一个动态web项目(无需web.xml) 2.右键 ...

  9. [Firebase] 2. Firebase Event Handling

    /** * Created by Answer1215 on 11/9/2014. */ var app = angular.module('app', ['firebase']); app.cons ...

  10. 创建sdcard.img时,提示permission dennid

    解决方法: mksdcard -l sdcard 100M E:\sdcard\sdcard.img 换一个盘试试,比如:mksdcard -l sdcard 100M F:\sdcard\sdcar ...