Java网络编程

Socket

  • 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。
  • Socket通常用来实现 client-server 连接。
  • java.net 包中定义的两个类 Socket 和 ServerSocket ,分别用来实现双向连接的 client 和 server 端。
  • 建立连接时所需的寻址信息为远程计算机的  IP 地址和端口号(Port number)。

Tcp Socket 通信模型

Socket使用示例:

public class Test {
    public static void main(String[] args) throws IOException{
        try (Socket s = new Socket("time-A.timefreq.bldrdoc.gov", 13)){ //打开一个套接字
            InputStream inStream = s.getInputStream(); //返回一个InputStream对象
            Scanner in = new Scanner(inStream);
            while(in.hasNextLine()){
                String line = in.nextLine();
                System.out.println(line);
            }
        }
    }
}

 

Socket对象:

  • Socket(String host, int port):构建一个套接字,用来连接给定的主机和端口;该方法会一直无限期阻塞下去,直到建立了到达主机的初始连接为止;  
  • InputStream getInputStream():获取可以从套接字中读取数据的流;  
  • OutputStream getOutputStream():获取可以向套接字中写出数据的流;
  • Socket():创建一个还未被连接的套接字;
  • void connect(SocketAddress address):将该套接字连接到给定的地址;
  • void connect(SocketAddress address, int timeoutInMilliseconds):将套接字连接到给定的地址。如果在给定的时间内没有响应,则返回;
  • void setSoTimeout(int timeoutInMilliseconds):设置该套接字上读请求的阻塞时间。如果超出给定时间,则抛出一个InterruptedIOException异常;
  • boolean isConnected():如果该套接字已被连接,则返回true;
  • boolean isClosed():如果该套接字已经被关闭,则返回true;
Socket s = new Socket();
s.connect(new InetSocketAddress(host, port), timeout);
//InetSocketAddress是SocketAddress的实现子类,SocketAddress是一个抽象类

 InetAddress对象:

  • static InetAddress getByName(String host)
  • static InetAddress[] getAllByName(String host):为给定的主机名创建一个InetAddress对象,或者一个包含了该主机名所对应的所有因特网地址的数组;
  • static InetAddress getlocalHost():为本地主机创建一个InetAddress对象;
  • byte[] getAddress():返回一个包含数字型地址的字节数组;
  • String getHostAddress():返回一个由十进制数组成的字符串,个数字间用圆点符号隔开,例如"132.163.4.102";
  • String getHostName():返回主机名;
InetAddress address = InetAddress.getByName(""time-A.timefreq.bldrdoc.gov"");//返回一个InetAddress对象,该对象封装了一个4字节的序列:132.163.4.104  
byte[] addressBytes = address.getAddress();
InetAddress[] addresses = InetAddress.getAllByName(host);
InetAddress address = InetAddress.getLocalHost();

 ServerSocket对象:

  • ServerSocket(int port):创建一个监听端口的服务器套接字;
  • Socket accept():等待连接。该方法阻塞(即使之空闲)当前线程直到建立连接为止。该方法返回一个Socket对象,程序可以通过这个对象与连接中的客户端进行通信;
  • void close():关闭服务器套接字; 

 

C/S实例:

服务端

import java.net.*;
import java.io.*;
public class TCPServer {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(6666);
        while(true) {
            Socket s = ss.accept();
            System.out.println("a client connect!");
            DataInputStream dis = new DataInputStream(s.getInputStream());
            System.out.println(dis.readUTF());
            dis.close();
            s.close();
        }
    }
}

 客户端

import java.net.*;
import java.io.*;
public class TCPClient {
    public static void main(String[] args) throws Exception{
        Socket s = new Socket("127.0.0.1", 6666);
        OutputStream os = s.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        Thread.sleep(30000);
        dos.writeUTF("hello server!");
        dos.flush();
        dos.close();
        s.close();
    }
}

 

posted @ 2017-03-27 11:20  dear_diary  阅读(483)  评论(0编辑  收藏  举报