1 基本客户端
下面的代码实现了一个连接到服务器,并从服务器上读取一段数据的程序。
sock = new Socket(host,port);
InputStream inputStream = sock.getInputStream();
Scanner in = new Scanner(inputStream);
while(in.hasNextLine())
{
String line = in.nextLine();
System.out.println(line);
}
sock.close();
2 基本服务器
下面的代码实现了一个接受客户端发送数据并输出的程序
ServerSocket srv = new ServerSocker(port)
Socket client = srv.accept();
OutputStream os = client.getOutputStream();
os.write();
可以使用Runnable接口和Thread类来开发多线程的服务器,不在此详述
3 建立URL链接
Java类库中,URI不包含访问资源的方法,它只用来解析。URL类可以访问远程资源的数据。
RFC2396是URI的标准。URI导出了一系列接口用来获取URI各部分的内容,也用于构造复杂的URI。
URL类:
InputStream openStream() 打开一个用于读取资源数据的输入流
URLConnection openConnection()
URLConnection类:
void setDoInput(bool doInput) 如果为true,则可以接收此连接上的输入。
void setDoOutput(bool doOuput) 如果为true,则可以将输出发送到此连接。
void setIfModifiedSince(long time) 设置只获取此此时之后的数据
void setUseCaches(bool) 如果为true,则数据可以从本地缓存得到。缓存由浏览器之类外部程序提供。
void setConnectTimeout(int ms) 设置连接的超时时间ms数
void setReadTimeout(int ms)
void setRequestProperty(String key,String val) 设置请求头属性的一个字段
Map> getRequestPropertimes() 返回请求头属性的映射表。
void connect() 执行连接
Map> getHeaderFields() 获取响应的映射表。
int getContentLength() 获取内容长度
String getContentType() 获取内容类型如text/plain
long getDate() getExpiration() getLastModifed() 获取相关的时间信息
InputStream getInputStream()
OutputStream getOutputStream()
HttpURLConnection类
InputStream getErrorStream() 返回一个流,用于读取服务器的错误信息。
URLEncoder类
static String encode(String s,String encoding) 采用字符编码模式推荐UTF-8以字符串进行编码,并返回其URL编码形式。编码后空格编码成'+',其他字符编码为%XY的形式。
URLDecoder类:
static String decode(String s,String encoding)
4 高级Socket编程
Socket类:
void connect(SocketAddress addr,int timeout)
bool isConnected()
bool isClosed()
void setSoTimeout(int ms) 设置超时ms数,超时后会抛出Timeout异常。
shutdownOutput() 采用半关闭,只关闭自己的输出。
shutdownInput()
SocketChannel类
static SocketChannel open(InetSocketAddress addr); 在指定地址上打开一个sc。
当采用sc时,当执行线程中断时,并不会因为socket上的同步操作而阻塞,而是会抛出异常而终止。通过此机制,可以实现socket的中断。
Channels类:
static InputStream newInputStream(channel)
static OutputStream newOutputStream(channel)
5 网络地址
InetAddress类:ip地址和域名的类
InetAddress getByName(String host) 获取域名的地址
InetAddress[] getAllByName(String) 获取域名的多个地址
InetAddress getLocalHost() 获取本地地址
byte[] getAddress()
String getHostAddress()
String getHostName()
InetSocketAddress类:IP地址+port的类(C中的sockaddr_in)
InetSocketAddress(string host,int port)
isUnresolved() 是否不能解析域名