欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Java学习手册:Java Socket,

来源: javaer 分享于  点击 49077 次 点评:176

Java学习手册:Java Socket,


一、Socket原理

socket通常称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。每种服务器都打开了一个Socket,并绑定到一个端口上,不同端口对应于不同的服务。应用程序通过“套接字”向网络发出请求或者应答网络请求。

网络上的两个程序通过一个双向的通信实现数据的交换,这个双向链路的一端称为一个Socket。Socket也成为套接字,可以用来实现不同虚拟机或不同计算机之间的通信。在Java语言中,Socket可以分为两种类型:面向连接的Socket通讯协议(TCP,Transmission Control Protocol,传输控制协议)和面向无连接的Socket通讯协议(UDP,User Datagram Protocol,用户数据报协议)。任何一个Socket都是由IP地址和端口号唯一确定的。

基于TCP的通信过程如下:首先,Server(服务器)端Listen(监听)指定的某个端口(建议使用大于1024的端口)是否有连接请求;其次,Client(客户)端向Server端发出Connect(连接)请求;最后,Server端向Client端发回Accept(接收)消息。一个连接就建立起来了,会话随机产生。Server端和Client端都可以通过Send、Write等方法与对方通信。

Socket的生命周期可以分为3个阶段:打开Socket、使用Socket收发数据和关闭Socket。在Java语言中,可以使用ServerSocket来作为服务器端,Socket作为客户端来实现网络通信。

Socket和ServerSocket类位于java.net包中,ServerSocket用于服务端,Socket是建立网络连接时使用的。

//获取本地地址和端口号
int getLocalPort()//获取本地使用的端口号
InetAddress getLocalAddress()//获取套接字的本地地址
String getCanonicalHostName()//获取此IP地址的完全限定域名
String getHostAddress()//返回IP地址字符串

//获取远端地址和端口号
int getPort()//获取远端使用的端口号
InetAddress.getInetAddress()//获取套接字绑定的远端地址

//获取网络输入流和网络输出流
InputStream getInputStream()//该方法用于返回此套接字的输入流
OutputStream getOutputStream()//该方法用于返回此套接字的输出流

//close方法
void close()//当使用Socket进行通讯完毕后,要关闭Socket以释放系统资源,当关闭了该套接字后也会同时关闭由此获取的输入流和输出流

//Server端ServerSocket监听
Socket accept()//java.net.ServerSocket是运行于服务端应用程序中,通常创建ServerSocket需要指定服务端口号,
//之后监听Socket的连接。该方法是一个阻塞的方法,直到一个客户都安通过Socket连接后,accept会封装一个Socket,
//该Socket封装与表示该客户端的有关信息。通过这个Socket与该可愈短进行通信。

二、用Socket实现客户端和服务器端的通信,要求客户端发送数据后能够回显相同的数据。

答:首先,创建一个名为Server.java的服务器端,代码如下:

package com.haobi;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 服务器端代码
 */
public class Server {
	public static void main(String[] args) {
		BufferedReader br = null;
		PrintWriter pw = null;
		try {
			ServerSocket server = new ServerSocket(2000);
			Socket socket = server.accept();
			//获取输入流
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			//获取输出流
			pw = new PrintWriter(socket.getOutputStream(), true);
			//接收获取的数据
			String s = br.readLine();
			//发送相同的数据给客户端
			pw.println(s);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				br.close();
				pw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
}

其次,创建一个Client.java的客户端程序,代码如下:

package com.haobi;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/*
 * 客户端代码
 */
public class Client {
	public static void main(String[] args) {
		BufferedReader br = null;
		PrintWriter pw = null;
		try {
			Socket socket = new Socket("localhost", 2000);
			//获取输入流与输出流
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			pw = new PrintWriter(socket.getOutputStream(), true);
			//向服务器发送数据
			pw.println("Hello");
			String s = null;
			while(true) {
				s = br.readLine();
				if(s!= null) {
					break;
				}
			}
			System.out.println(s);
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				br.close();
				pw.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		
	}
}

最后启动服务器端程序,然后运行客户端程序,客户端将会把从服务器端转发过来的“Hello”打印出来。

相关文章

    暂无相关文章
相关栏目:

用户点评