java socket通信

socket通信是指两台计算机的两个程序之间的通信,双向链路的每一端都称为一个socket,但分为客户机和服务器。

java.net提供了ServerSocket和Socket类,分别用于服务器和客户端。

通信过程:

建立Socket连接,客户端程序申请连接,服务器端程序监听所有端口,判断是否有客户端的服务器请求,当客户端申请某个端口连接时,服务器将对方的ip和端口号绑定形成套接字,这样服务器和客户机就建立了一个专用虚拟连接,可以相互通信了,通信结束后将虚拟连接拆除。

编程步骤:服务器先建立一个服务器套接字ServerSocket,并指定端口号监听客户机请求,然后建立一个Socket用来和客户机通信,客户机建立端建立同一端口的Socket以便和服务器通信。

 

java.net包含以上两个类:

主要方法说明:

ServerSocket(int port)在指定端口上创建服务器Socket对象

ServerSocket(int port,int count)count 为最大连接数

Sorket(InetAddress IP,int port)使用指定IP和端口建立Socket对象

Sorket(String host,int port)使用指定主机和端口建立Socket对象

以上两个方法有对三个选项 boolean stream(布尔值表示是否选用流式通信)

可以用Socket类的 getInputstream 和getOutstream来读写数据的输入输出流。但要进行异常处理,读取输入输出流后要建立更容易操作的InputStreamReader和Out..... 通信结束后close(Socket)断开连接。

 

Socket应用:

 

服务器:

package Socket;
import java.io.*;
import java.net.*;
public class Serverclass{
public static final int SERVERPORT = 9999; //服务器端口号
public static void main(String[] args ){
try{
ServerSocket s = new ServerSocket(SERVERPORT);
System.out.println("开始:" + s); //建立服务器端监听套接字
Socket incoming = s.accept( );//等待并接收请求,建立连接套接字
System.out.println("连接并接收到:" + incoming);//收到连接请求,incoming为套接字端口
BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
//新建网络连接输入流,读取incoming端口传来的信息,为一个对象,传入数据的格式,通过in.readline()翻译
PrintWriter out = new PrintWriter( new BufferedWriter(new OutputStreamWriter(incoming.getOutputStream())), true);
//新建自动刷新的网络输出流,作用:通过out.println()向客户端输出信息。
System.out.println( "输入quit退出" );
while (true){
String line = in.readLine(); //按行读取socket输入
if (line == null) break;
else{
if (line.trim().equals("quit")){
System.out.println("客户端输入了quit!");
System.out.println("连接已经关闭!");
break; }
System.out.println("客户端输入的是:" + line);
out.println("您输入的是:" + line);}}
incoming.close();}
catch (IOException e){ //异常处理
System.err.println("输入输出异常"+e.getMessage());}
}
}

 

 

 

客户端:

package S;
import java.io.*;
import java.net.*;

public class server {
public static final int PORT=9999;
public static void main(String args[]){
try{
Socket s=new Socket("localhost",PORT);//建立连接套接字
System.out.println("socket"+s);//输出端口信息
//新建网络连接输入流
BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
//自动刷新的网络连接输出流
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(
s.getOutputStream())),true);
//构造stdin
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入一个字符串,quit退出");
while(true){
//先对如系统输入,在通过套接字输出,out为PrintWriter对象
out.println(stdin.readLine());//out的参数为BufferedWriter类,stdin。readline()
String str=in.readLine();
if(str==null)
break;
System.out.println(str);

}
s.close();
}
catch(IOException e){
System.err.println("错误:"+e.getMessage() );
}
}

}

posted @ 2015-05-18 12:46  hitz&x  阅读(430)  评论(0编辑  收藏  举报