java Socket通信原理
具体如下:
首先socket 通信是基于TCP/IP 网络层上的一种传送方式,我们通常把TCP和UDP称为传输层。其中UDP是一种面向无连接的传输层协议。UDP不关心对端是否真正收到了传送过去的数据。
如果需要检查对端是否收到分组数据包,或者对端是否连接到网络,则需要在应用程序中实现。UDP常用在分组数据较少或多播、广播通信以及视频通信等多媒体领域。
在这里我们不进行详细讨论,这里主要讲解的是基于TCP/IP协议下的socket通信。
socket是基于应用服务与TCP/IP通信之间的一个抽象,他将TCP/IP协议里面复杂的通信逻辑进行分装。
服务端初始化ServerSocket,然后对指定的端口进行绑定,接着对端口及进行监听,通过调用accept方法阻塞。
此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
java的客户端用的是Socket,服务器端用SocketChannel,这两种能实现通信么? 说得比较白,望理解
Socket 和ServerSocke 是一对 他们是java.net下面实现socket通信的类
SocketChannel 和ServerSocketChannel是一对 他们是java.nio下面实现通信的类 支持异步通信
服务器必须先建立ServerSocket或者ServerSocketChannel 来等待客户端的连接
客户端必须建立相对应的Socket或者SocketChannel来与服务器建立连接
服务器接受到客户端的连接受,再生成一个Socket或者SocketChannel与此客户端通信
不过Socket和SocketChannel可以通过 socket.channel() SocketChannel.socket() 方法相互转换
同理ServerSocket 和ServerSocketChannel 也可以相互转换
Java Socket开发 关于报文传递和接收
看 Oracle 官方教程,同步式的 Socket 就是传统的一问一答方式,它就是你需要的。
客户端先 socket.getOutputStream().write(…); 之后到 socket.getInputStream().read(byte[]) 在循环中读取直到 read 方法返回 -1 或你期望的字节数已经全部收到了就停下来,如果不尝试停下来,后面的 read 将会阻塞等待。
基于性能改进,一般我们需要使用 NIO 异步的 socket,只需要一个线程负责通信,每个线程都有自己的出站消息队列和入站消息队列,以线程为 key 区分开,通信线程只负责把各自的消息从出站队列中发送去并把收到的消息放入入站队列中,应用程序线程就去各自的消息队列中取消息就可以了。因为每个应用线程有各自的消息队列,我们把消息放入出站队列之后就到入站队列上用同步锁等待的方法阻塞到有消息回答时为止。
关于 NIO non-blocking 非阻塞式 socket,下面有一个 NBTimeServer 例子,它讲的是服务端。客户端与此类似,
NIO 通信线程样例。
public void run()
{
int tip = 0;
try
{
selector = Selector.open();
SelectionKey k = channel.register(selector, getInterestOptions());
k.attach(thread); // 把当前线程绑定到附件中。
this.running = true;
statusChanged(Status.CONNECTED);
while (this.isRunning())
{
// select() is a blocking operation.
int eventCount = selector.select();
debug(“[MC.Debug] Polling TCP events … ” + eventCount);
if (eventCount 0 channel.isOpen() this.isRunning())
{
Set keys = selector.selectedKeys();
for (Iterator iter = keys.iterator(); iter.hasNext(); iter.remove())
{
SelectionKey key = (SelectionKey) iter.next();
Thread thread = (Thread) key.attachment();
if (!key.isValid())
{ // channel is closing.
break;
}
process(key); // 处理读取消息并把消息放入 thread 对应的队列。//写出消息类似的,不过在 register 时需要注册写出允许的事件,
}
}
}
}
Socket异步通讯,求指明什么意思
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse(“127.0.0.1”),2020);
serverSocket.Bind(serverIp);
serverSocket.Listen(100);
Console.WriteLine(“服务器开始异步监听…”);
AsyncAccept(serverSocket);
Console.WriteLine(“按任意键退出…”);
Console.ReadKey();
}
private static void AsyncAccept(Socket serverSocket)
{
try
{
serverSocket.BeginAccept(asyncResult =//①①①①①①①①①①①①①①
{
Socket clientSocket = serverSocket.EndAccept(asyncResult);
//AsyncSend(clientSocket,”连接成功”);
AsyncReceive(clientSocket);
AsyncAccept(serverSocket);
C#里有没有和java aio类似的异步非阻塞socket通信
1、关于异步:
java中异步请求就是*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理这个调用。
2、阻塞式I/O模型:默认情况下,所有套接字都是阻塞的。
一个输入操作通常包括两个不同阶段:
(1)等待数据准备好;(2)从内核向进程复制数据。
3、非阻塞式I/O: 进程把一个套接字设置成非阻塞是在通知内核,当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把进程投入睡眠,而是返回一个错误。看看非阻塞的套接字的recvfrom操作如何进行