概述
什么是Socket?
Socket,用于描述IP地址和端口,是一个通信链的句柄,在Internet上的主机一遍运行了多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应不同的服务。
来源:http://blog.csdn.net/a704755096/article/details/46004235;端口被占用:http://blog.csdn.net/xiaanming/article/details/9401981;
Socket 连接手机,安卓需设置访问网络权限
客户端的用法如下:
(1)Socket()
(2)Socket(InetAddress address, int port)throws UnknownHostException,IOException
(3)Socket(InetAddress address, int port, InetAddress localAddr, int localPort)throws IOException
(4)Socket(String host, int port) throws UnknownHostException,IOException
(5)Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
Socket socket=new Socket (“localhost”,8000);//IP地址,端口 与服务端一致
BufferedReader s = new BufferedReader(new InputStreamReader(socket.getInputStream()));//最后必须关闭所有的流close()
String readLine = s.readLine();
- 设定客户端的地址:
在一个Socket对象中,既包含远程服务器的IP地址和端口信息,也包含本地客户端的IP地址和端口信息。默认情况下,客户端的IP地址来自于客户程序所在的主机,客户端的端口则由操作系统随机分配。Socket类还有两个构造方法允许显式的设置客户端的IP地址和端口:
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)throws IOException
Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException
2.客户连接服务器时可能抛出的异常:
当Socket的构造方法请求连接服务器时,可能会抛出以下异常:
UnknownHostException:如果无法识别主机的名字或IP地址,就会抛出这种异常。
ConnectException:如果没有服务器进程监听指定的端口,或者服务器进程拒绝连接,就会抛出这种异常。
SocketTimeoutException:如果等待连接超时,就会抛出这种异常。
BindException:如果无法把Socket对象与指定的本地IP地址或端口绑定,就会抛出这种异常。
3.获取Socket的信息
以下方法用于获取Socket的有关信息:
getInetAddress():获得远程服务器的IP地址。
getPort():获得远程服务器的端口。
getLocalAddress():获得客户本地的IP地址。
getLocalPort():获得客户本地的端口。
getInputStream():获得输入流。如果Socket还没有连接,或者已经关闭,或者已经通过shutdownInput()方法关闭输入流,那么此方法会抛出IOException。
getOutputStream():获得输出流。如果Socket还没有连接,或者已经关闭,或者已经通过shutdownOutput()方法关闭输出流,那么此方法会抛出IOException。
4.了解Socket的用途
说了一大堆关于,到底socket怎么用,用来干什么呢?
看了图大概明白了,socket就是用来和服务器进行通信的方法。
服务端的用法如下:
ServerSocket ss = new ServerSocket(int port);//服务端端口
Socket accept =ss.accept();
SocketAddress sa = accept.getRemoteSocketAddress();//客服端IP地址
OutputStream os = accept.getOutputStream();
os.write("连上手机".getBytes());//最后必须关闭所有的流close()
1)Accept方法用于产生”阻塞”,知道接收到一个连接,并且返回一个客户端的socket对象实例。”阻塞”是一个术语,它使程序运行暂时”停留”在这个地方,直到一个会话产生,然后程序继续,通常”阻塞”是由循环产生的。开子线程进行耗时操作。
2)getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
3)getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例,注意:其中getInputStream和getOutputStream方法均可能会产生一个IOException,所以必须使用try/catch捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
什么是WebSocket? (什么是RabbitMQ:http://blog.csdn.net/a704755096/article/details/45969717)
websocket协议是近些年随html5发展而诞生的,主要用于解决web服务器与客户端无法双向交互的问题。如今已经被W3C收入标准协议。与socket相比,可以节省额外的端口占用,直接使用一个公网域名访问。另外协议对报文的流量消耗做了优化。以下简单介绍websocket 客户端:
import java.net.URI;
import java.net.URISyntaxException;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;
import org.java_websocket.drafts.Draft_17;
import org.java_websocket.framing.Framedata;
import org.java_websocket.handshake.ServerHandshake;
public class WebSocketUtils extends WebSocketClient {
public WebSocketUtils( URI serverUri , Draft draft ) {
super( serverUri, draft );
}
public WebSocketUtils( URI serverURI ) {
super( serverURI );
}
@Override
public void onOpen( ServerHandshake handshakedata ) {
System.out.println( "开流--opened connection" );
}
@Override
public void onMessage( String message ) {
System.out.println( "接收--received: " + message );
//子线程
}
@Override
public void onFragment( Framedata fragment ) {
System.out.println( "片段--received fragment: " + new String( fragment.getPayloadData().array() ) );
}
@Override
public void onClose( int code, String reason, boolean remote ) {
System.out.println( "关流--Connection closed by :" + ( remote ? "remote peer" : "us" ) );
}
@Override
public void onError( Exception ex ) {
ex.printStackTrace();
}
//jar包地址:http://download.csdn.net/detail/a704755096/9573178
//
public static void main(String[] args) {
//
try {
//
WebSocketUtils c = new WebSocketUtils( new URI( "ws://xxx" ), new Draft_17() );
//
c.connectBlocking();
//
if(c!=null&&c.isOpen()) {
//
c.send("测试---handshake");
//
}
//
} catch (InterruptedException e) {
//
e.printStackTrace();
//
} catch (URISyntaxException e) {
//
e.printStackTrace();
//
}
//
}
}
最后
以上就是知性老师为你收集整理的JAVA通信socket/websocket的全部内容,希望文章能够帮你解决JAVA通信socket/websocket所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复