一、按照套接字在网络中的作用分为
服务器端ServerSocket: 服务器端的套接字始终在监听是否有连接请求,如果发现客户机端Socket向服务器发出连接请求,则服务器端Socket向客户机端Socket发回“接受”的消息。
客户机端Socket: 当客户机端发出的建立连接的请求被服务器端接受时,客户机上就会创建一个Socket对象。利用这个Socket对象,客户机就可以和服务器进行通信了。
二、 Socket类
Socket类常用的构造方法如下:
Socket(InetAddressaddress, intport)
此方法创建一个要连接的远程主机地址为address、端口号为port的流套接字。 (若使用本地主机作为服务器则应写“localhost”)。
构造一个新的Socket实例后,可使用:getInputStream()方法获得一个InputStream类的实例或getOutputStream()方法获得一个OutputStream类的实例,从某个主机接收信息或发送信息到某个主机。
通过Socket类也可用getInetAddress()和getLocalAddress()方法返回一个InetAddress类的实例,即所连接到的主机的IP地址以及本地IP地址。
通过Socket类还可用getPort()方法返回所连接到的主机的端口号,getLocalPort()方法返回正在使用的本地端口号。
三、ServerSocket类
当服务器建立了ServerSocket套接字对象以后,可以使用该对象的accept()方法接受客户端请求的套接字连接。
serverSocket.accept();
该方法调用后,服务器处于阻塞状态,等待客户端的连接请求,在接到客户端请求的套接字连接请求以后,该方法将返回Socket对象。
Scocketsc=serverSocket.accept();
这个Socket对象是已经和客户端建立好连接的套接字,可以通过这个Socket对象获取客户端的输入输出流来实现数据发送和接受。
四、连接的关闭!
n每一个Socket存在时,都将占用一定的资源,在Socket对象使用完毕时,要其关闭。关闭Socket可以调用Socket的Close()方法。
n在关闭Socket之前,应将与Socket相关的所有的输入/输出流全部关闭,以释放所有的资源。而且要注意关闭的顺序,与Socket相关的所有的输入/输出该首先关闭,然后再关闭Socket。
n os.close(); //关闭输出流
n is.close(); //关闭输出流
socket.close(); //关闭socket
五、example
客户端向服务器端发送数据
服务器端显示客户端发送的数据
当服务器端收到“Exit”,服务器退出
public classServer {
public staticvoid main(String args[]) {
try { //创建服务器到解字
ServerSocketserver= new ServerSocket(9527);
System.out.println("服务器启动完毕");
Socket socket= server.accept();// 等待客户端连接
System.out.println("创建客户连接");
InputStreaminput= socket.getInputStream();
// 获取Socket输入
InputStreamReaderisreader= new
InputStreamReader(input);
BufferedReaderreader= new BufferedReader(isreader);
while (true) {
String str= reader.readLine();
if(str.equals("exit"))//如果接收到exit
break;// 则退出服务器
System.out.println("接收内容:"+str);//输出接收内容
}
System.out.println("连接断开");
reader.close();//按顺序关闭连接
isreader.close();
input.close();
socket.close();
server.close();
}catch (IOException e) {
e.printStackTrace();
}}}
publicclass Client{
public static void main(String[] args){
try {
Socket socket=new Socket("localhost",9527);
// 创建连接服务器的Socket
OutputStreamout = socket.getOutputStream();
// 获取Socket输出
out.write("这是我第一次访问服务器\n".getBytes());
// 向服务器发送数据
out.write("Hello\n".getBytes());
out.write("exit\n".getBytes());//发送退出信息
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();}}}