网络通信
基本概念
协议:协议是一组在网络上发送信息的规则和约定。这些规则控制在网络
设备间交换消息的内容、格式、定时、顺序和
错误控制。
IP:在Internet上有千百万台主机,为了区分这些主机,人们给每台主机都分配了一个专门的地址,称为IP地址。
32 位数字,四个用点号分隔的数字
包括网络 ID 和主机 ID
网络的类包括 A、B、C、D、E 类
DNS:ip地址都是数字,太难记
DNS将 IP 地址映射至字符串
映射由
域名服务器系统维护
端口:有别于设备端口,是用来
理解的逻辑概念
用于实现程序间的通信
常用的端口
-----------------------------------------------------------------------------------------------------------------------
URL:URL(Uniformed Resource Location) 指向Internet 上的资源文件
URL 类提供 API 来访问 Internet 上的信息
构造方法
URL(String urlname)
URL(String protocol, String hostname, int port, String path)
URL(String protocol, String hostname, String path)
URLConenction openConnection()
URLConnection:
抽象类
用于封装由 URL 表示的 Web 对象的连接
提供进一步了解
远程资源的方法
InputStream getInputStream()
OutputSteam getOutputStream()
InetAddress:
InetAddress 的实例包含 IP 地址,还可能包含相应的主机名。
工厂方法用于创建实例
InetAddress getLocalHost()
InetAddress getByName(String host)
InetAddress[] getAllByName(String host)
取本机计算机名及所有IP地址:
此类表示互联网协议 (IP) 地址
InetAddress addr = InetAddress.getLocalHost();
String hostName = addr.getHostName();//取得本机机器的名字
InetAddress[] addrs = InetAddress.getAllByName(hostName);
//保存ip的数组
String [] allIp = new String[addrs.length];
for(int i = 0; i < addrs.length; i++)
addrs[i] = addrs[i].getHostName();
-------------------------------------------------------------------------------------------------------------------------------
SOCKET通信过程:
ServerSocket服务器和客户端
什么是TCP?
TCP(传输控制协议)是一种基于流的网络通讯方法,它与其它的任何协议都有很大的不同。TCP提供的网络通讯
接口与UDP(用户数据报协议)截然不同:
基于UPD与基于TCP相比,基于UDP的通信传输速度更快;
但基于UDP的通信不能提供可靠性,即发出的信息接收方不一定收到,发出信息的顺序与接收的顺序不一定相同。
TCP通信过程:
我们可以将基于TCP的通信比做打电话;一方负责
监听,一方负责呼叫,呼叫的一方为客户端,监听的一方为服务器端。
服务器端
socket绑定于特定端口,服务器侦听socket等待连接请求
客户端向服务器和特定端口提交连接请求
服务器接受连接,产生一新的socket,绑定到另一端口,由此socket来处理和客户端的交互,服务器继续侦听原socket来接受其他客户端的连接请求
连接成功后客户端也产生一socket,并通过它来与服务器端通讯(注意:客户端socket并不与特定端口绑定)
服务器端和客户端就通过读取和写入各自的socket来进行通讯。
ServerSocket:
此类实现服务器套接字
构造方法
ServerSocket(int port)
ServerSocket(int port, int backlog)
ServerSocket(int port, int backlog, InetAddress bindAddr)
Socket accept() 侦听并接受到此套接字的连接
Socket:
实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器之间的通信端点
构造方法
Socket(InetAddress address, int port)
Socket(String host, int port)
通信要用到的常用方法
InputStream getInputStream()
OutputStream getOutputStream()
Socket通讯过程:
服务器端:
1.建立
服务端ServerSocket 表示对客户端连接感兴趣:
ServerSocket server = new ServerSocket(8321);
2.监听客户端连接:
Socket socket = server.accept();
4.当客户端连接上来之后就可以获得流开始通信了
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
可以对输入输出流进行套接以便发送不同的数据。
客户端:
3.建立客户端Socket连接到服务端ServerSocket
Socket socket = new Socket("127.0.0.1",8321);
5.通过Socket得到输入输出流就可以和服务器通信了
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
可以对输入输出流进行套接以便发送不同的数据
注意:
客户端和服务器,输入输出流的先后顺序
-----------------------------------------------------------------------------------------------------------------------------------
服务端:
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
try {
// 1创建ServerSocket
serverSocket = new ServerSocket(8099);
System.out.println("服务器已经启动.....");
// 2监听客户端Socket的连接
socket = serverSocket.accept();
//socket.getInetAddress()
// 3获取输出流
OutputStream outputStream = socket.getOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
outputStream);
// 发送消息
String msg = "您好,您已经连接上了服务器!";
objectOutputStream.writeObject(msg);
objectOutputStream.flush();
// 接收来自客户端的消息
// 获取输入流
InputStream inputStream = socket.getInputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(
inputStream);
// 获取来自服务端的消息
String msgFromClient = objectInputStream.readObject().toString();
System.out.println("客户端》》服务端:" + msgFromClient);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TestClient {
public static void main(String[] args) {
// 创建客户端Socket
Socket socket = null;
try {
socket = new Socket("127.0.0.1", 8099);
// 获取输入流
InputStream inputStream = socket.getInputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(
inputStream);
// 获取来自服务端的消息
String msg = objectInputStream.readObject().toString();
System.out.println("服务端》》客户端:" + msg);
// 3获取输出流
OutputStream outputStream = socket.getOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
outputStream);
// 发送消息
String msgToServer = "我这真的连接上了吗??!";
objectOutputStream.writeObject(msgToServer);
objectOutputStream.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}