java网络编程 socket编程

JAVA SOCKET网络编程,服务端接收多个客户端连接的实现 - 推酷
JAVA SOCKET网络编程,服务端接收多个客户端连接的实现
这是基于前面一篇文章的一个简单扩展,当然这不是最好的实现
服务端如果要想接收多个客户端连接,必须死循环去接收新的客户端的连接请求,一个完整的客户端服务端socket连接通过一个线程来维护
package com.tree.demo.
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.io.PrintW
import java.net.ServerS
import java.net.S
import java.util.S
class ThreadServerSocket implements Runnable {
public ThreadServerSocket(Socket i) {
// TODO Auto-generated constructor stub
public void run() {
// TODO Auto-generated method stub
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();
Scanner sc = new Scanner(in);
PrintWriter pw = new PrintWriter(out,true/*autoFlush*/);
pw.println(&Hello ! Enter BYE to Exit.&);
while(sc.hasNextLine()) {
String line = sc.nextLine();
pw.println(&Echo:&+line);
if(line.trim().equals(&BYE&)) {
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public class MulServerSocketDemo {
private static final int PORT = 1234;
//private static final int BUFFER_SIZE = 1024;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int counter = 1;
ServerSocket ss = new ServerSocket(PORT);
while(true) {
Socket s = ss.accept();
System.out.println(&第 &+(counter++)+& 个连接&);
Thread t = new Thread(new ThreadServerSocket(s));
t.start();
启动以上程序之后,通过命令行,telnet命令来试验下
同时开了6个连接,当然也可以通过JAVA来是实现:
package com.tree.demo.
import java.io.IOE
import java.io.InputS
import java.io.OutputS
import java.io.PrintW
import java.net.ServerS
import java.net.S
import java.util.S
class ThreadServerSocket implements Runnable {
private int BUFFER_SIZE = 1024;
public ThreadServerSocket(Socket i) {
// TODO Auto-generated constructor stub
public void run() {
// TODO Auto-generated method stub
InputStream in = server.getInputStream();
OutputStream out = server.getOutputStream();
byte[] recData =
while(true) {
recData = new byte[BUFFER_SIZE];
int r = in.read(recData);
//int r = in.read(recData);
if(r&-1) {
String data = new String(recData);
if(data.trim().equals(&over&)) {
server.close();
System.out.println(&读取到客户端发送的来数据:&+data);
out.write(&这是服务端发给客户端的数据:&.getBytes());
out.write(recData);
System.out.println(&数据读取完毕!&);
server.close();
//ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public class MulServerSocketDemo {
private static final int PORT = 1234;
//private static final int BUFFER_SIZE = 1024;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int counter = 1;
ServerSocket ss = new ServerSocket(PORT);
while(true) {
Socket s = ss.accept();
System.out.println(&第 &+(counter++)+& 个连接&);
Thread t = new Thread(new ThreadServerSocket(s));
t.start();
import java.io.IOE
import java.io.OutputS
import java.net.InetSocketA
import java.net.S
class ThreadClientSocket implements Runnable {
private static final String HOST = &192.168.8.17&;
private static final int PORT = 1234;
public ThreadClientSocket() {
client = new Socket();
client.connect(new InetSocketAddress(HOST, PORT), 500);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public void run() {
// TODO Auto-generated method stub
OutputStream out = client.getOutputStream();
int counter = 0;
while (true) {
System.out.println(&Thread--&&+Thread.currentThread().getName());
out.write(&Heart Beat !&.getBytes());
System.out.println(client + &================& + (counter++));
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
public class MulClientSocketDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int counter = 4;
while((counter--)&0) {
new Thread(new ThreadClientSocket()).start();;
// client.setTcpNoDelay(true);
该实现仍然有很多不足,更好的实现可通过通道来实现,未完待续..........
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致读懂Java中的Socket编程 - ImportNew
Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一。如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的。本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序。
Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本。当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限。一旦IO操作对象被打开,那么这个用户进程可以对这个对象进行一次或多次的读取或写入操作。Read操作用来从IO操作对象读取数据,并将数据传递给用户进程。Write操作用来将用户进程中的数据传递(写入)到IO操作对象。 当所有的Read和Write操作结束之后,用户进程需要调用Close来通知系统其完成对IO对象的使用。
在Unix开始支持进程间通信(InterProcess Communication,简称IPC)时,IPC的接口就设计得类似文件IO操作接口。在Unix中,一个进程会有一套可以进行读取写入的IO描述符。IO描述符可以是文件,设备或者是通信通道(socket套接字)。一个文件描述符由三部分组成:创建(打开socket),读取写入数据(接受和发送到socket)还有销毁(关闭socket)。
在Unix系统中,类BSD版本的IPC接口是作为TCP和UDP协议之上的一层进行实现的。消息的目的地使用socket地址来表示。一个socket地址是由网络地址和端口号组成的通信标识符。
进程间通信操作需要一对儿socket。进程间通信通过在一个进程中的一个socket与另一个进程中得另一个socket进行数据传输来完成。当一个消息执行发出后,这个消息在发送端的socket中处于排队状态,直到下层的网络协议将这些消息发送出去。当消息到达接收端的socket后,其也会处于排队状态,直到接收端的进程对这条消息进行了接收处理。
TCP和UDP通信
关于socket编程我们有两种通信协议可以进行选择。一种是数据报通信,另一种就是流通信。
数据报通信
数据报通信协议,就是我们常说的UDP(User Data Protocol 用户数据报协议)。UDP是一种无连接的协议,这就意味着我们每次发送数据报时,需要同时发送本机的socket描述符和接收端的socket描述符。因此,我们在每次通信时都需要发送额外的数据。
流通信协议,也叫做TCP(Transfer Control Protocol,传输控制协议)。和UDP不同,TCP是一种基于连接的协议。在使用流通信之前,我们必须在通信的一对儿socket之间建立连接。其中一个socket作为服务器进行监听连接请求。另一个则作为客户端进行连接请求。一旦两个socket建立好了连接,他们可以单向或双向进行数据传输。
读到这里,我们多少有这样的疑问,我们进行socket编程使用UDP还是TCP呢。选择基于何种协议的socket编程取决于你的具体的客户端-服务器端程序的应用场景。下面我们简单分析一下TCP和UDP协议的区别,或许可以帮助你更好地选择使用哪种。
在UDP中,每次发送数据报时,需要附带上本机的socket描述符和接收端的socket描述符。而由于TCP是基于连接的协议,在通信的socket对之间需要在通信之前建立连接,因此会有建立连接这一耗时存在于TCP协议的socket编程。
在UDP中,数据报数据在大小上有64KB的限制。而TCP中也不存在这样的限制。一旦TCP通信的socket对建立了连接,他们之间的通信就类似IO流,所有的数据会按照接受时的顺序读取。
UDP是一种不可靠的协议,发送的数据报不一定会按照其发送顺序被接收端的socket接受。然后TCP是一种可靠的协议。接收端收到的包的顺序和包在发送端的顺序是一致的。
简而言之,TCP适合于诸如远程登录(rlogin,telnet)和文件传输(FTP)这类的网络服务。因为这些需要传输的数据的大小不确定。而UDP相比TCP更加简单轻量一些。UDP用来实现实时性较高或者丢包不重要的一些服务。在局域网中UDP的丢包率都相对比较低。
Java中的socket编程
下面的部分我将通过一些示例讲解一下如何使用socket编写客户端和服务器端的程序。
注意:在接下来的示例中,我将使用基于TCP/IP协议的socket编程,因为这个协议远远比UDP/IP使用的要广泛。并且所有的socket相关的类都位于java.net包下,所以在我们进行socket编程时需要引入这个包。
客户端编写
开启Socket
如果在客户端,你需要写下如下的代码就可以打开一个socket。
String host = &127.0.0.1&;
int port = 8919;
Socket client = new Socket(host, port);
上面代码中,host即客户端需要连接的机器,port就是服务器端用来监听请求的端口。在选择端口时,需要注意一点,就是0~1023这些端口都已经被系统预留了。这些端口为一些常用的服务所使用,比如邮件,FTP和HTTP。当你在编写服务器端的代码,选择端口时,请选择一个大于1023的端口。
接下来就是写入请求数据,我们从客户端的socket对象中得到OutputStream对象,然后写入数据后。很类似文件IO的处理代码。
public class ClientSocket {
public static void main(String args[]) {
String host = &127.0.0.1&;
int port = 8919;
Socket client = new Socket(host, port);
Writer writer = new OutputStreamWriter(client.getOutputStream());
writer.write(&Hello From Client&);
writer.flush();
writer.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
关闭IO对象
类似文件IO,在读写数据完成后,我们需要对IO对象进行关闭,以确保资源的正确释放。
服务器端编写
打开服务器端的socket
int port = 8919;
ServerSocket server = new ServerSocket(port);
Socket socket = server.accept();
上面的代码创建了一个服务器端的socket,然后调用accept方法监听并获取客户端的请求socket。accept方法是一个阻塞方法,在服务器端与客户端之间建立联系之前会一直等待阻塞。
通过上面得到的socket对象获取InputStream对象,然后安装文件IO一样读取数据即可。这里我们将内容打印出来。
public class ServerClient {
public static void main(String[] args) {
int port = 8919;
ServerSocket server = new ServerSocket(port);
Socket socket = server.accept();
Reader reader = new InputStreamReader(socket.getInputStream());
char chars[] = new char[1024];
StringBuilder builder = new StringBuilder();
while ((len=reader.read(chars)) != -1) {
builder.append(new String(chars, 0, len));
System.out.println(&Receive from client message=: & + builder);
reader.close();
socket.close();
server.close();
} catch (Exception e) {
e.printStackTrace();
关闭IO对象
还是不能忘记的,最后需要正确地关闭IO对象,以确保资源的正确释放。
附注一个例子
这里我们增加一个例子,使用socket实现一个回声服务器,就是服务器会将客户端发送过来的数据传回给客户端。代码很简单。
import java.io.*;
import java.net.*;
public class EchoServer {
public static void main(String args[]) {
// declaration section:
// declare a server socket and a client socket for the server
// declare an input and an output stream
ServerSocket echoServer =
DataInputS
Socket clientSocket =
// Try to open a server socket on port 9999
// Note that we can't choose a port less than 1023 if we are not
// privileged users (root)
echoServer = new ServerSocket(9999);
catch (IOException e) {
System.out.println(e);
// Create a socket object from the ServerSocket to listen and accept
// connections.
// Open input and output streams
clientSocket = echoServer.accept();
is = new DataInputStream(clientSocket.getInputStream());
os = new PrintStream(clientSocket.getOutputStream());
// As long as we receive data, echo that data back to the client.
while (true) {
line = is.readLine();
os.println(line);
} catch (IOException e) {
System.out.println(e);
编译运行上面的代码,进行如下请求,就可以看到客户端请求携带的数据的内容。
15:00 $ curl http://127.0.0.1:
GET /?111 HTTP/1.1
User-Agent: curl/7.37.1
Host: 127.0.0.1:9999
Accept: */*
进行客户端-服务器端编程还是比较有趣的,同时在Java中进行socket编程要比其他语言(如C)要简单快速编写。
java.net这个包里面包含了很多强大灵活的类供开发者进行网络编程,在进行网络编程中,建议使用这个包下面的API。同时Sun.*这个包也包含了很多的网络编程相关的类,但是不建议使用这个包下面的API,因为这个包可能会改变,另外这个包不能保证在所有的平台都有包含。
第2个问题点,这句“而所有的线程共享一片相同的内存空间”,需要讲的更明确一些。我觉得需要指明是同一个...
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2016 ImportNew&&&&Java TCP/IP Socket 编程中文版PDF
&Java TCP/IP Socket 编程中文版PDF
中文名: Java TCP/IP Socket编程原名: TCPIP Sockets in Java Practical Guide for Programmers
作者: Calvert
Donahoo图书
分类: 软件
资源格式: PDF
版本: 第二版
出版社: Morgan Kaufmann
书号: 978-0-12-
发行时间: 2008年
地区: 美国
语言: 英文(本版为中文)
内容简介:
本书基于tcp/ip socket相关原理,对如何在java中进行socket编程作了深入浅出的介绍。.
本书内容简明扼要,条理清晰,并在讲解相应的概念或编程技巧时列举了大量的示例程序,每章附有练习。
本书适合作为java socket编程的入门教程,也可供从事网络相关专业的技术人员参考。
在tcp/ip socket首次发布时,java作为一个新的未被关注的编程语言刚出现。然而,自2001年以来,java的网络,编程能力已经得到了很大程度的扩展,而且持续的应用优势已经使其成为了一个占主导地位的平台。考虑到java受欢迎程度和近期在形式上和功能上令人兴奋的创新,本书的新版涵盖了java的当前最新版本的内容(1.5版至1.7版),以及一些新的重要的抽象,包括networkinterface,intedaceaddress,inet4/6address抽象、socketaddress/inetsocketaddress 和executor等。现在几乎所有互联网应用程序都使用javasocket进行通信,而本书专注的、教导式的方法,使读者能够快速掌握所有计算机通信的任务和技术要点。
第1章 简介
1.1 计算机网络、分组报文和协议
1.2 关于地址
1.3 关于名字
1.4 客户端和服务器
1.5 什么是套接字
第2章 基本套接字
2.1 套接字地址
2.2 tcp套接字
2.2.1 tcp客户端
2.2.2 tcp服务器端
2.2.3 输入输出流
2.3 udp套接字
2.3.1 datagrampacket类
2.3.2 udp客户端
2.3.3 udp服务器端
2.3.4 使用udp套接字发送和接收信息
若举报审核通过,可奖励20下载分
被举报人:
zhangjinpeng66
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
Java TCP/IP Socket 编程中文版PDF
所需积分:0
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
Java TCP/IP Socket 编程中文版PDF
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员java socket编程实例代码讲解
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了java socket编程示例讲解,大家参考使用吧
1、所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
操作java socket时用到的最多的三个方法为:
accept():主要用于服务器端产生“阻塞”,等待客户端的链接请求,并且返回一个客户端的Socket实例;
getInputStream():方法主要用来获得网络连接输入,同时返回一个InputStream对象实例;
getOutputStream():方法和上面的getInputStream相反。
2、一般要建立Java的Socket连接,应首先明确服务器端和客户端,服务器端使用ServerSocket监听指定的端口,使用accept等待客户端请求,链接链接,开始会话、完成会话后,关闭链接。(注意,一般socket的关闭都应该是服务器端来进行的,后面说);客户端使用Socket对网络中的某个服务器的某个端口发出链接请求,连接成功,开始会话,会话完成,Socket关闭。
2、示例代码:
服务器端:
代码如下:package com.icer.
import java.io.BufferedRimport java.io.IOEimport java.io.InputStreamRimport java.io.OutputSimport java.io.PrintWimport java.net.ServerSimport java.net.S
/**&* Server&* &* @author Icer&* &*/public class Server {
&&& private ServerS&&& private S&&& private BufferedR&&& private PrintW
&&& public Server() {&&&&&&& try {&&&&&&&&&&&&&&& ss = new ServerSocket(10000);&&&&&&&&&&&&&&& System.out.println("Server is starting...");&&&&&&&&&&&&&&& s = ss.accept();&&&&&&&&&&&&&&& br = new BufferedReader(new InputStreamReader(s.getInputStream()));&&&&&&&&&&&&&&& pw = new PrintWriter(s.getOutputStream(),true);&&&&&&&&&&&&&&& String line = br.readLine();&&&&&&&&&&&&&&& System.out.println(line);&&&&&&&&&&&&&&& pw.println("your word is:" + line);&&&&&&&&&&&&&&& //pw.println("helloworld");&&&&&&&&&&&&&&& br.close();&&&&&&&&&&&&&&& pw.close();
&&&&&&& } catch (IOException ie) {&&&&&&&&&&& ie.printStackTrace();&&&&&&& }
&&& public static void main(String[] args) throws Exception {&&&&&&& new Server();&&& }}
代码如下:package com.icer.
import java.io.BufferedRimport java.io.Fimport java.io.FileInputSimport java.io.IOEimport java.io.InputStreamRimport java.io.PrintWimport java.net.S
/**&* Client&* @author Icer&*&*/public class Client {&&& private S&&& private BufferedR&&& //private BufferedR&&& private PrintW&&& private String line = "";&&& public Client() {&&&&&&& try{&&&&&&&&&&& s = new Socket("127.0.0.1",10000);&&&&&&&&&&& pw = new PrintWriter(s.getOutputStream(),true);&&&&&&&&&&& br = new BufferedReader(new InputStreamReader(s.getInputStream()));&&&&&&&&&&& pw.println("hello");&&&&&&&&&&& line = br.readLine();&&&&&&&&&&& System.out.println(line);&&&&&&&&&&& br.close();&&&&&&&&&&& pw.close();&&&&&&& }catch(IOException ie){&&&&&&&&&&& ie.printStackTrace();&&&&&&& }&&& }&&& public static void main(String[] args) throws Exception {&&&&&&& new Client();&&& }}
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 java socket 的文章

 

随机推荐