包含socket事件java的词条
今天给各位分享socket事件java的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
关于java的Socket
你后面是不是说反了?
Socket s=new Socket(127.0.0.1); 这个是客户端形式
ServerSocket ss=new ServerSocket();
ss.accept();
这个是服务器端形式
Java的Socket 通信原理是服务器端一直监听客户端的事件,有就响应.
第二种情况,你服务器端都没监听,你客户端就请求当然有错.
什么是java socket
事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的Api来完成这些工作。Socket就是其中之一,对于Java而言,这些Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。
网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两者之间的联系,然后完成数据的通讯就可以了,这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端,基于这个简单的模型,就可以进入网络编程啦。
Java对这个模型的支持有很多种Api,而这里我只想介绍有关Socket的编程接口,对于Java而言已经简化了Socket的编程接口。首先我们来讨论有关提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你,ServerSocket server=new ServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。好了,我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持,只要客户方创建一个Socket的实例对象进行支持就可以了。Socket client
=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。
上面的方法基本可以建立一条连线让两台计算机相互交流了,可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的,除非远程调用,处理问题的核心在执行上,否则数据的交互还是依赖于IO操作的,所以你也必须导入java.io这个包.java的IO操作也不复杂,它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。
在百度搜索里输入java socket会有N多的结果给你答案。
Java Socket常见异常处理
在java网络编程Socket通信中 通常会遇到以下异常情况
第 个异常是 BindException:Address already in use: JVM_Bind
该异常发生在服务器端进行new ServerSocket(port)(port是一个 的整型值)操作时 异常的原因是以为与port一样的一个端口已经被启动 并进行监听 此时用netstat an命令 可以看到一个Listending状态的端口 只需要找一个没有被占用的端口就能解决该问题了
第 个异常是 ConnectException: Connection refused: connect
该异常发生在客户端进行 new Socket(ip port)操作时 该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由) 或者是该ip存在 但找不到指定的端口进行监听 出现该问题 首先检查客户端的ip和port是否写错 如果正确则从客户端ping一下服务器看是否能ping通 如果能ping通(服务器端把ping禁掉则需要另外的办法) 则看在服务器端的监听指定端口的程序是否启动 这个肯定能解决这个问题
第 个异常是 SocketException: Socket is closed
该异常在客户端和服务器均可能发生 异常的原因是本端主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作
第 个异常是 SocketException: (Connection reset或者Connect reset by peer:Socket write error)
该异常在客户端和服务器端均有可能发生 引起该异常的原因有两个 第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭) 另一端仍发送数据 发送的第一个数据包引发该异常(Connect reset by peer) 另一个是一端退出 但退出时并未关闭该连接 另一端如果在从连接中读数据则抛出该异常(Connection reset) 简单的说就是由连接断开后的读和写操作引起的
第 个异常是 SocketException: Broken pipe
该异常在客户端和服务器均有可能发生 在第 个异常的第一种情况中(也就是抛出 SocketExcepton:Connect reset by peer:Socket write error后) 如果再继续写数据则抛出该异常 前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接 其次是要检测对方的关闭连接操作 发现对方关闭连接后自己也要关闭该连接
二.编写网络程序时需要注意的问题:
是要正确区分长 短连接 所谓的长连接是指一经建立就永久保持 短连接的情况是 准备数据—建立连接—发送数据—关闭连接 很多的程序员写了多年的网络程序 居然不知道什么是长连接 什么是短连接
是对长连接的维护 所谓维护包括两个方面 首先是检测对方的主动断连(即调用 Socket的close方法) 其次是检测对方的宕机 异常退出及网络不通 这是一个健壮的通信程序必须具备的 检测对方的主动断连很简单 主要一方主动断连 另一方如果在进行读操作 则此时的返回值只 一旦检测到对方断连 则应该主动关闭本端的连接(调用Socket的close方法) 而检测对方的宕机 异常退出及网络不通 常用方法是用 心跳 也就是双方周期性的发送数据给对方 同时也从对方接收 心跳 如果连续几个周期都没有收到对方心跳 则可以判断对方宕机 异常退出或者网络不通 此时也需要主动关闭本端连接 如果是客户端可在延迟一定时间后重新发起连接 虽然Socket有一个keep alive选项来维护连接 如果用该选项 一般需要两个小时才能发现对方的宕机 异常退出及网络不通
lishixinzhi/Article/program/Java/hx/201311/26630
JAVA NIO 怎么捕获Socket关闭事件
JAVA NIO 捕获Socket关闭事件的方法
服务端代码:
Java codeimport java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class TCP {
ServerSocketChannel socketChannel;
Selector selector;
int port = 8778;
String[] opsName=new String[17];
ByteBuffer buffer;
int count = 0;
public TCP(){
opsName[SelectionKey.OP_ACCEPT]="OP_ACCEPT";
opsName[SelectionKey.OP_CONNECT]="OP_CONNECT";
opsName[SelectionKey.OP_READ]="OP_READ";
opsName[SelectionKey.OP_WRITE]="OP_WRITE";
buffer =ByteBuffer.allocate(10);
try {
socketChannel=ServerSocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.socket().setReuseAddress(true);
socketChannel.socket().bind(new InetSocketAddress(port));
selector=Selector.open();
System.out.println(socketChannel.hashCode());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void start(){
try {
socketChannel.register(selector, SelectionKey.OP_ACCEPT);
} catch (ClosedChannelException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("server start port "+port);
while(true){
int n;
try {
System.out.print("wait...");
n = selector.select(60000);
System.out.println(n);
if(n=0)continue;
IteratorSelectionKey it = selector.selectedKeys().iterator();
while(it.hasNext()){
SelectionKey key = it.next();
it.remove();
System.out.println("key:"+opsName[key.interestOps()]+","+key.channel().hashCode());
if(key.isReadable()){
System.out.println(key.hashCode()+" isReadable");
socketChannel.accept().register(selector, SelectionKey.OP_READ);
}
else if(key.isAcceptable()){
System.out.println(key.hashCode()+" accepted");
SocketChannel client =socketChannel.accept();
client.configureBlocking(false);
//client.register(selector, SelectionKey.OP_WRITE);
//SocketChannel client =(SocketChannel) key.channel();
buffer.clear();
buffer.putInt(count++);
buffer.flip();
client.write(buffer);
System.out.println(client.hashCode()+" write..");
}
else if(key.isWritable()){
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TCP tcp = new TCP();
tcp.start();
}
}
java socket
原因分析:Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这样就出现了上面这个问题。java.net.SocketException: Software caused connection abort: socket write error。网上的解决方法有几种,我选用第一种:在mysql安装目录下找到my.ini文件中添加超时限制:在该文件最后添加一行:wait_timeout=2880000。这样把之前的超时限制把8小时(28800)扩大为800小时。这样重启了mysql后再在其中输入命令:show global variables like "wait_timeout";查看超时是否已修改为:2880000。重启tomcat(如果已启动),OK。
socket事件java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、socket事件java的信息别忘了在本站进行查找喔。