一、TCP/IP协议
为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TCP/IP协议。
TCP/IP协议是一个协议组,包含Telnet、FTP、SMTP、NFS、HTTP等协议。
网络接口层:负责接收和发送物理帧;
网络层:负责相邻节点之间的通信;
传输层:负责起点到终点的通信;
应用层:提供诸如文件传输、电子邮件等应用程序。
二、InetAddress类
Java中inelAddress类是针对Java封装的互联网协议(IP)地址,它是Java对IP地址的一种高级标志。
public static void main(String argsp[]) throws UnknownHostException {
InetAddress addr = InetAddress.getByName("it.warmtel.com");
String hostAddress = addr.getHostAddress();//获取主机地址
String hostName = addr.getHostName();//获取主机名
System.out.println("主机名:" + hostName + ",\t主机地址:" + hostAddress);
}
三、统一资源定位符URL
1、定义:
URL是一种最为直观的网络定位方式,它表示Internet上的某一资源地址。
2、格式:
<Method> ://<hostName:PORT>/<PATH>/<FILE>
<传输协议>:// <主机名:端口> /<路径名>/ <文件名>
例如:http 端口号默认为80可省略
3、Java中URL类
一个URL对象可以表示一个网络资源。程序利用URL对象能实现Internet寻址、网络资源的定位连接、在客户机与服务器之间直接访问等。
public static void main(String[] args) throws IOException {
URL url = new URL("http://www.baidu.com");
URLConnection connection = url.openConnection();// 建立链接
// 建立缓冲输入流
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String str;
while (br.readLine() != null) {
str = br.readLine();
System.out.println(str);
}
}
四、Socket类
1、UDP协议和TCP协议
(1)UDP无连接,TCP面向链接
(2)UDP每个数据包大小限制为64k,TCP可以传输较大的数据
(3)UDP将传输的数据分成小包,直接上网发送。无需建立连接和拆除连接,速度快,但无可靠保证。
TCP每次通信前建立连接,通信结束后断开连接。特点是可以保证传输的正确性、可靠性。
2、Socket是TCP/IP协议的一种编程方式
一个Socket由一个IP地址和一个端口号唯一确定
(1)客户端Socket
/**
* 启动客户端
*/
public void startClient() {
try {
Socket socket = new Socket(IP, PORT);
sendMsg(socket);
getMsg(socket);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 客户端发送消息
*
* @param socket
*/
public void sendMsg(Socket socket) {
new Thread(new Runnable() {
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(socket.getOutputStream());
System.out.println("请输入要发送的消息:");
String msg = br.readLine();
while (msg != null) {
pw.println(msg);
pw.flush();
System.out.println("发送成功!");
System.out.println("请输入要发送的消息:");
msg = br.readLine();
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 客户端接收消息
*/
public void getMsg(Socket socket) {
new Thread(new Runnable() {
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = br.readLine();
System.out.println("服务器:" + msg);
while (true) {
msg = br.readLine();
System.out.println("服务器:" + msg);
}
} catch (IOException e) {
}
}
}).start();
}
(2)服务端Soceket
/**
* 服务端启动
*
* @throws IOException
*/
public void startServer() throws IOException {
ServerSocket sSocket = new ServerSocket(PORT);
System.out.println("欢迎进入");
sendMsg();
while (true) {
Socket socket = sSocket.accept();
System.out.println("新用户加入聊天");
socketList.add(socket);
getMsg(socket);
size = socketList.size();
System.out.println("当前用户人数:[" + size + "]人");
}
}
/**
* 服务端群发消息
*/
public void sendMsg() {
new Thread(new Runnable() {
@Override
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.println("请输入要发送的信息:");
String msg = br.readLine();
for (Socket s : socketList) {
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.println(msg);
pw.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
/**
* 服务器接收消息并且转发给除发送信息外其他客户端
*/
public void getMsg(Socket socket) {
new Thread(new Runnable() {
@Override
public void run() {
BufferedReader br;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String msg = br.readLine();
if (msg != null) {
System.out.println("客户端:" + msg);
}
for (Socket s : socketList) {
if (s == socket)
continue;
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.println(msg);
pw.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}