在Java中,服务器程序的基本生命周期
使用一个ServerSocket()构造函数在一个特定端口创建一个新的ServerSocket。
ServerSocket使用其accept()方法监听这个端口的入站连接。accept()会一直阻塞,直到一个客户端尝试建立连接,此时accept()将返回一个连接客户端和服务器的Socket对象。
根据服务器的类型,会调用Socket的getInputStream()方法或getOutputStream()方法,或者这两个方法都调用,以获得与客户端通信的输入和输出流。
服务器和客户端根据已协商的协议交互,直到要关闭连接
服务器或客户端(或二者)关闭连接
服务器返回到步骤2,等待下一次连接
阅读全文
基本操作Socket是两台主机之间的一个连接。它可以完成7个基本操作
连接远程机器
发送数据
接收数据
关闭连接
绑定端口
监听入站数据
在绑定端口上接收来自远程机器的连接
Java的Socket类提供了对应前4个操作的方法,后三个仅服务器需要,即等待客户端的连接
阅读全文
基本步骤使用URLconnection类的程序遵循以下基本步骤
构造一个URL对象
调用这个URL对象的openConnection()获取一个对应URL的URLConnected对象
配置这个URLConnected
读取首部字段
获得输入流并读取数据
获得输出流并写入数据
关闭连接
阅读全文
创建InetAddress对象
getByAddress(byte[] addr) static InetAddress 根据提供的IP地址创建 InetAddress
getByAddress(String host, byte[] addr) static InetAddress 根据提供的主机名和IP地址创建 InetAddress
getByName(String host) static InetAddress 根据提供的主机名创建 InetAddress
getAllByName(String host) static InetAddress[] 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
getLocalHost() static InetAddress 返回本地主机
getLoopbackAddress() static InetAddress 返回回送地址,在Windows系统中,采用127.0.0.1
阅读全文
Pattern类
返回类型
方法名
解释
static Pattern
compile(String regex)
将给定的正则表达式编译到模式中。
static Pattern
compile(String regex, int flags)
将给定的正则表达式编译到具有给定标志的模式中。
int
flags()
返回此模式的匹配标志。
Matcher
matcher(CharSequence input)
创建匹配给定输入与此模式的匹配器。
static boolean
matches(String regex, CharSequence input)
编译给定正则表达式并尝试将给定输入与其匹配。
String
pattern()
返回在其中编译过此模式的正则表达式。
static String
quote(String s)
返回指定 String 的字面值模式 String。
String[]
split(CharSequence input)
围绕此模式的匹配拆分给定输入序列。
String[]
split(CharSequence input, int limit)
围绕此模式的匹配拆分给定输入序列。
String
toString()
返回此模式的字符串表示形式。
阅读全文
新建 /**
* 新建文件
* @param path 绝对路径
* @return 新建成功返回ture,新建失败或以存在此文件返回false
*/
public static boolean newFile(String path)
{
File file = new File(path);
file.getParentFile().mkdirs();
try
{
return file.createNewFile();
} catch (IOException e)
{
e.printStackTrace();
return false;
}
}
阅读全文
InputStreamReaderpublic class Test
{
public static void main(String[] args) throws IOException
{
InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\Test11.txt"));
//markSupported() boolean 判断此流是否支持 mark() 操作以及支持哪一项操作。
System.out.println("markSupported():" + isr.markSupported());
//ready() boolean 判断此流是否已经准备好用于读取。
System.out.println("ready():" + isr.ready());
//read() int 读取单个字符。
System.out.println("read():" + isr.read());
char[] chars1 = new char[26];
//read(char[] cbuf) int 将字符读入数组。
isr.read(chars1);
System.out.println("read(char[] cbuf):" + new String(chars1));
char[] chars2 = new char[26];
//read(char[] cbuf, int off, int len) int 将字符读入数组的某一部分。
isr.read(chars2, 0, 13);
System.out.println("read(char[] cbuf, int off, int len):" + new String(chars2));
//skip(long ns) long 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
isr.skip(1);
//close() void 关闭该流并释放与之关联的所有系统资源。
isr.close();
}
}
阅读全文
ByteArrayInputStreampublic class Test
{
public static void main(String[] args) throws IOException
{
byte[] bytes1 = new byte[52];
for(int i = 0;i < bytes1.length;i++)
{
bytes1[i] = (byte) ('a' + i%26);
}
ByteArrayInputStream bais1 = new ByteArrayInputStream(bytes1);
//skip(long n) long 从此输入流中跳过 n 个输入字节。
System.out.println("skip(long n):" + bais1.skip(256));
//available() int 返回可从此输入流读取(或跳过)的剩余字节数。
System.out.println("available():" + bais1.available());
//markSupported() boolean 测试此 InputStream 是否支持 mark/reset。
System.out.println("markSupported():" + bais1.markSupported());
//mark(int readAheadLimit) void 设置流中的当前标记位置。
bais1.mark(512);
//read() int 从此输入流中读取下一个数据字节。
System.out.println("read():" + bais1.read());
byte[] bytes2 = new byte[512];
//read(byte[] int 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
System.out.println("read(byte[]):" + bais1.read(bytes2));
System.out.println(new String(bytes2));
//read(byte[] b, int off, int len) int 将最多 len 个数据字节从此输入流读入 byte 数组。
System.out.println("read(byte[] b, int off, int len):" + bais1.read(bytes2, 0, 128));
System.out.println(new String(bytes2));
//reset() void 将缓冲区的位置重置为标记位置。
bais1.reset();
System.out.println("reset():" + bais1.available());
//close() void 关闭 ByteArrayInputStream
bais1.close();
}
}
阅读全文