网络编程概述
-
网络通信要素概述:
-
通信双方地址:
- IP:网络中唯一定位的一台主机
- 端口号:区分一台主机上不同的应用程序
-
一定的规则(即网络通信协议)
-
TCP/IP协议
-
-
IP的理解与InetAdress类的实例化
/**
* 1.唯一的标识 Internet 上的计算机(通信实体)
* 2.IP分类:IPV4和IPV6;公网和局域网
* 3.在Java中用InetAddress类代表IP
* 4.域名:www.baidu.com www.apple.com
* 5.本地回路地址127.0.0.1 对应着localhost
*
* 6.如何实例化InetAddress: getByName(String host)、getLocalHost()
* 两个常用方法:getHostName() getHostAddress()
*/
public class InetTest {
public static void main(String[] args) {
try {
InetAddress inet1 = InetAddress.getByName("192.168.10.14");
System.out.println(inet1);
InetAddress inet2 = InetAddress.getByName("www.baidu.com");
System.out.println(inet2);
InetAddress inet3 = InetAddress.getByName("localhost");
System.out.println(inet3);
//获取本地ip
System.out.println(InetAddress.getLocalHost());
//getHostName() 获取域名
System.out.println(inet2.getHostName());
//getHostAddress() 获取ip地址
System.out.println(inet2.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
端口号的理解
- 端口号:正在计算机上运行的进程
- 要求:不同的进程要有不同的端口号
TCP和UDP网络通信协议的对比
- 网络通信协议:计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
- 通信协议分层的思想:在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。
TCP网络编程例题1
/**
* 实现TCP的网络编程
* 例1:客户端发送信息给服务端,服务端将数据显示在控制台上
*/
public class TCPTest1 {
//客户端
@Test
public void client() throws IOException {
//1.创建socket对象,指明服务器端的ip和端口号
InetAddress inet = InetAddress.getByName("127.0.0.1");
Socket socket = new Socket(inet,8899);
//2.获取一个输出流,用于输出数据
OutputStream outputStream = socket.getOutputStream();
//3.写出数据的操作
outputStream.write("你好,我是客户端".getBytes());
//4.资源的关闭
outputStream.close();
socket.close();
}
//服务端
@Test
public void server() throws IOException {
//1.创建服务器端的ServerSocket,指明自己的端口号
ServerSocket serverSocket = new ServerSocket(8899);
//2.调用accept()方法表示接收来自客户端的socket
Socket socket = serverSocket.accept();
//3.获取输入流
InputStream inputStream = socket.getInputStream();
//不建议下面这样写,可能会乱码
// byte[] buffer = new byte[20];
// int len;
// while ((len=inputStream.read(buffer))!=-1){
// String str = new String(buffer,0,len);
// System.out.print(str);
// }
//4.读取输入流中的数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[20];
int len;
while ((len=inputStream.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
System.out.println("收到了来自"+socket.getInetAddress().getHostAddress()+"的数据");
//5.关闭资源
baos.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
TCP网络编程例题2
/**
* 实现TCP的网络编程
* 例题2:客户端发送文件给服务端,服务端将文件保存在本地
*/
public class TCPTest2 {
@Test
public void client() throws IOException {
Socket socket = new Socket(InetAddress.getByName("172.0.0.1"),9090);
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream(new File("D:\\wallpaper\\Stay.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
fis.close();
os.close();
socket.close();
}
@Test
public void server() throws IOException {
ServerSocket serverSocket = new ServerSocket(9090);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream("beauty.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
TCP网络编程例题3
public class TCPTest3 {
@Test
public void client() throws IOException {
Socket socket = new Socket(InetAddress.getByName("172.0.0.1"),9090);
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream(new File("D:\\wallpaper\\Stay.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//接收来自服务器端的数据,并显示到控制台上
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[20];
int len2;
while ((len2=inputStream.read(buffer2))!=-1){
baos.write(buffer2,0,len);
}
//关闭数据的输出
socket.shutdownOutput();
System.out.println(baos.toString());
fis.close();
os.close();
socket.close();
baos.close();
inputStream.close();
}
@Test
public void server() throws IOException {
ServerSocket serverSocket = new ServerSocket(9090);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream("beauty.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//服务器端给予客户端反馈
OutputStream outputStream = socket.getOutputStream();
outputStream.write("照片已经收到!".getBytes());
fos.close();
is.close();
socket.close();
serverSocket.close();
outputStream.close();
}
}
浏览器访问Tomcat服务器资源操作
UDP网络编程举例
/**
* UDP网络编程
*/
public class UDPTest {
//发送端
@Test
public void send() throws IOException {
DatagramSocket socket = new DatagramSocket();
String str = "我是UDP方式发送的数据";
InetAddress inet = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket(str.getBytes(),0,str.length(),inet,9090);
socket.send(packet);
socket.close();
}
//接收端
@Test
public void receiver() throws IOException {
DatagramSocket socket = new DatagramSocket(9090);
byte[] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
}
URL类的理解和实例化
/**
* URL网络编程
* 1.URL:统一资源定位符 对应着互联网上某一资源地址
* 2.格式:<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
*
*/
public class URLTest {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123");
System.out.println(url.getProtocol());
System.out.println(url.getHost());
System.out.println(url.getFile());
System.out.println(url.getQuery());
}
}