Java Socket底层采用TCP/IP协议通信,通信细节被封装,我们仅仅需要指定IP、端口,便能轻易地创建TCP或UDP连接,进行网络通信。数据的读写,可以使用我们熟悉的stream进行操作。
TCP通信中,服务端与客户端是一对多的关系,如下图
Client发起连接请求后,Server端响应并创建一个Socket实例,与Client端一对一通信。通信完毕后,Client端与Server端的Socket实例各自关闭连接并销毁,此次通信结束。
发起连接的三次握手和关闭连接的四次挥手过程暂且不表,后续文章详细介绍。下面看具体代码
服务端代码
package com.coshaho.learn.socket; import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* SocketServer.java Create on 2017年12月16日 下午11:42:03
* 类功能说明: socket服务端
* @Author coshaho
*/
public class SocketServer
{
public static void main(String[] args) throws Exception
{
// 创建服务端
ServerSocket server = new ServerSocket(10000); // 服务端阻塞式监听客户端连接请求
// 接收到连接请求,则创建一个socket实例,与客户端通信
Socket client = server.accept(); // 获取InputStream读取数据
InputStream in = client.getInputStream();
byte[] b = new byte[1024];
// 客户端关闭输出流后服务端会读取到-1标志
while(-1 != in.read(b))
{
System.out.println(new String(b));
} // 获取OutputStream输出数据
OutputStream out = client.getOutputStream();
out.write("hello, client".getBytes());
// 输出结束,关闭输出流
client.shutdownOutput(); System.out.println("Server close. " + System.currentTimeMillis());
server.close();
}
}
客户端代码
package com.coshaho.learn.socket; import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket; /**
* SocketClient.java Create on 2017年12月16日 下午11:42:53
* 类功能说明: socket客户端
* @Author coshaho
*/
public class SocketClient
{
public static void main(String[] args) throws Exception
{
// 请求连接服务端,握手成功,返回Socket实例
Socket client = new Socket("127.0.0.1",10000); // 获取输入输出流,读写数据(与服务端数据读写操作相同)
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream(); out.write("hello, server".getBytes());
client.shutdownOutput(); byte[] b = new byte[1024];
while(-1 != in.read(b))
{
System.out.println(new String(b));
} System.out.println("Client close. " + System.currentTimeMillis());
client.close();
}
}
Java Socket入门的更多相关文章
-
Java Socket 入门2 Java与C# Socket 通信
参考http://www.cnblogs.com/cdtarena/p/3184313.html 这里以C#作为服务端 其实不论C#是服务端还是客户端都不是主要问题 毕竟不论客户端还是服务端 都包括 ...
-
Java Socket 入门1
由程序逻辑可以看到 这是一个 客户端和服务端一对一聊天的程序 首先由服务端说第一句话然后对话才开始 且只能客户端一行话 服务端再一行话 这样往复进行 客户端若想不等服务端回应继续说话是不行的 服 ...
-
Java Socket NIO入门
Java Socket.SocketServer的读写.连接事件监听,都是阻塞式的.Java提供了另外一种非阻塞式读写.连接事件监听方式——NIO.本文简单的介绍一个NIO Socket入门例子,原理 ...
-
《JAVA 从入门到精通》 - 正式走向JAVA项目开发的路
以前很多时候会开玩笑,说什么,三天学会PHP,七天精通Nodejs,xx天学会xx ... 一般来说,这样子说的多半都带有一点讽刺的意味,我也基本上从不相信什么快速入门.我以前在学校的时候自觉过很多门 ...
-
java socket通讯(二)处理多个客户端连接
通过java socket通讯(一) 入门示例,就可以实现服务端和客户端的socket通讯,但是上一个例子只能实现一个服务端和一个客户端之间的通讯,如果有多个客户端连接服务端,则需要通过多线程技术来实 ...
-
如何为可扩展系统进行Java Socket编程
从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频游戏工资工作,在哪里我主要的工作就是编写Unix Unix Berkley Socket ...
-
Java Socket聊天室编程(一)之利用socket实现聊天之消息推送
这篇文章主要介绍了Java Socket聊天室编程(一)之利用socket实现聊天之消息推送的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 网上已经有很多利用socket实现聊天的例子了 ...
-
史上最强Java NIO入门:担心从入门到放弃的,请读这篇!
本文原题“<NIO 入门>,作者为“Gregory M. Travis”,他是<JDK 1.4 Tutorial>等书籍的作者. 1.引言 Java NIO是Java 1.4版 ...
-
是时候了解Java Socket底层实现了
在Java中,提供了一系列Socket API,可以轻松建立两个主机之间的连接.读取数据,那底层到底怎么实现,很少人去关心.这其实最终还是通过调用操作系统提供得Socket接口完成(TCP/IP是由操 ...
随机推荐
-
Reversing Linked List
原题连接:https://www.patest.cn/contests/pat-a-practise/1074 题目: Given a constant K and a singly linked l ...
-
创建.emacs.d目录和.emacs文件
1.双击bin下的addpm.exe 2.HKEY_CURRENT_USER->Software->GNU->Emacs 新建字符串值HOME,数值数据为emacs的安装路径 3.创 ...
-
mongogogog
$cmp,$eq,$gt,$gte,$lt,$lte,$ne$setEquals,$setIntersection,$setUnion,$setDifference,$setLsSubset,$any ...
-
JS window.open()属性
一. Window 对象 Window 对象是 JavaScript 层级中的顶层对象. Window 对象代表一个浏览器窗口或一个框架. Window 对象会在 <body> 或 < ...
-
iOS运行时工具-cycript
cycript是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在运行时查看和修改应用.它确实可以帮助你破解一些应用,但我觉得这个工具主要还是用来学习其他应用的设计(主要是 ...
-
UNITY3D在IOS开发下的反射机制限制
IOS上的反射是部分支持,支持使用反射读取源代码,但不支持使用反射动态生成可执行代码,下面是限制反射的命名空间:ProfilerReflection.EmitReflection.Emit.Save ...
-
SQL里的EXISTS与in、not exists与not in
系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists 修改方法如下: in的SQL语句 SELEC ...
-
maven私服搭建和启动遇到的问题
1.私服下载地址:http://www.sonatype.org/nexus/ 2.在win10中安装nexus时提示:wrapper | OpenSCManager failed - 拒绝访问. ( ...
-
基于XMPP的即时通信系统的建立(四)— 组件介绍
服务端 服务器 许可证 操作系统 是否支持任意客户端登录 备注 ejabberd 开源 Elang 是 支持虚拟主机和集群 Openfire Apache Java 是 Tigase GPLv3 Ja ...
-
Servlet3.0学习总结(三)——基于Servlet3.0的文件上传
在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不 ...