您的位置:首页 > 理论基础 > 计算机网络

java第二十一天(网络编程)

2019-05-31 07:02 2161 查看

91.网络编程

(1)网络模型

OSI模型:七层协议

TCP/IP模型:常用

(2)网络通信三要素

第一:ip地址

使用dos命令查看ip地址,ipconfig

ip最大值是233.255.255.255,可设置区间1.0.0.0-233.255.255.255

用dos命令查看主机是否互通的,ping 域名\ip地址

回环地址:127.0.0.1

 第二 端口号,用于标识进程的逻辑地址,不同的进程端口不同

dos命令查看端口号,netstat-ano

第三,协议

常见的有两种协议:

TCP和UDP协议

UDP:

将数据源和目的地封装到数据包中,不需要建立连接。

每个数据包的大小限制在64k。

因为不建立连接,所以安全性差,速度快。

TCP:

建立连接形成传输数据的通道,然后再传输数据,通过三次的握手。

安全性高,效率低。 

(3)InetAdress类

单例模式(没有构造器),不能直接new,根据静态方法来返回该对象

getByName(String name)根据已知的给定的主机名确定主机的IP地址

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAdressDemo {
public static void main(String[] args) throws UnknownHostException {
//通过静态方法返回InetAddress的对象
InetAddress localHost = InetAddress.getLocalHost();
//获得IP地址的字符串
String hostAddress = localHost.getHostAddress();
System.out.println("IP地址是"+hostAddress);
//获得IP地址中的主机的名字
String hostName = localHost.getHostName();
System.out.println("主机名是"+hostName);
//根据给定的主机名返回该对象
InetAddress byName = InetAddress.getByName("C64-20190318DQZ");
String hostAddress1 = byName.getHostAddress();
String hostName1 = byName.getHostName();
System.out.println("IP地址是"+hostAddress1);
System.out.println("IP地址是"+hostName1);
}
}

(4)UDP通信

分两个部分

服务端步骤

第一步:创建socket服务对象(需要做关闭)

DatagramSocket(int port)

第二步:接收数据,用DataGrampacket表示数据包

DataGramPacket(byte[] buf,int length)

第三步:解析数据包

接收数据 receive(),程序到此阻塞有数据接收则继续

获得客户端的ip,getAdress();

获得数据 getData();

获得长度 getLength();

import java.net.*;

public class UdpServer {
public static void main(String[] args){
//服务器端步骤一,创建Socket服务对象(需要做关闭)
DatagramSocket socket = null;

try {
socket=new DatagramSocket(10000);
//步骤二,创建接收数据包
byte[] buf=new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
System.out.println("服务端开始启动,等待客户端发送内容");
//步骤三,解析数据
socket.receive(datagramPacket);//程序到此阻塞,有数据传入继续
//获得客户端的ip
InetAddress inetAddress = datagramPacket.getAddress();
//获得数据
byte[] data = datagramPacket.getData();
int length=datagramPacket.getLength();
String s=new String(data,0,length);
System.out.println(inetAddress.getHostAddress()+"发送的内容是"+s+"      长度是"+length);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(socket!=null){
socket.close();
}

}

}
}

客户端步骤:

第一步:创建DatagramSocket不用给端口(需关闭)

第二步:创建数据包

DatagramPacket(byte[] buf,int length,InetAddress address,int port)

第三步:发送数据包

send();

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpClient {
public static void main(String[] args){
//服务器端步骤一,创建Socket服务对象(需要做关闭,不用给端口)
DatagramSocket socket = null;

try {
socket=new DatagramSocket();
//步骤二,创建接收数据包
String s="爱我中华!";
byte[] buf=s.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000);
//步骤三,解析数据
socket.send(datagramPacket);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(socket!=null){
socket.close();
}

}

}
}

先运行服务端再运行客户端,服务端就显示出来了

拓展:

注意字符字节的转换,从控制台输入的东西是以字节流方式存在的,让程序实现从控制台输入数据接收

用BufferReader,不断接收使用While(true)

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpServer {
public static void main(String[] args){
//服务器端步骤一,创建Socket服务对象(需要做关闭)
DatagramSocket socket = null;

try {
socket=new DatagramSocket(10000);
//步骤二,创建接收数据包
byte[] buf=new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
System.out.println("服务端开始启动,等待客户端发送内容");
//步骤三,解析数据
while(true){
socket.receive(datagramPacket);//程序到此阻塞,有数据传入继续
//获得客户端的ip
InetAddress inetAddress = datagramPacket.getAddress();
//获得数据
byte[] data = datagramPacket.getData();
int length=datagramPacket.getLength();
String s=new String(data,0,length);
System.out.println(inetAddress.getHostAddress()+"发送的内容是:     "+s);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(socket!=null){
socket.close();
}

}

}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpClient {
public static void main(String[] args){
//服务器端步骤一,创建Socket服务对象(需要做关闭,不用给端口)
DatagramSocket socket = null;
BufferedReader reader=null;
try {
socket=new DatagramSocket();
//注意从控制台输入的内容是以字节流的方式存储的,所以读取的是字节流,为了更方便显示把字节流转换成字符流
reader=new BufferedReader(new InputStreamReader(System.in));
//步骤二,创建接收数据包
String s=null;
//使其不断接收使用While(true)
while((s=reader.readLine())!=null){
//设置退出循环的标识
if("exit".equals(s)){
break;
}else{
byte[] buf=s.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.11"),10000);
//步骤三,解析数据
socket.send(datagramPacket);
}
}
System.out.println("退出客户端");
} catch (Exception e) {
e.printStackTrace();
} finally {
if(socket!=null){
socket.close();
}
try {
if(reader!=null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}

}

}
}

TCP通信

服务端

第一步:创建Socket对象指定端口(需关闭)

ServerSocket(int port);

第二步:监听接收客户端对象Socket(也需要关闭)

Socket accept();

第三步:获得流对象

getInputStream();                BfferedReader

第四步:读取数据

第五步:获得客户端的IP地址

getHostAdress();

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
public static void main(String[] args) {
//步骤一,创建服务端ServerSocket对象,指定端口(需要关闭)
ServerSocket serverSocket = null;
BufferedReader reader=null;
//步骤二,创建监听接收客户端对象Socket
Socket socket=null;
try {
serverSocket= new ServerSocket(9999);
socket=serverSocket.accept();
//步骤三,获得流对象,注意字节流字符流的转换
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//步骤四,读取数据
String s = reader.readLine();
//步骤五,获得客户端的ip地址
InetAddress inetAddress = socket.getInetAddress();
System.out.println(inetAddress.getHostAddress()+"发送的内容是:  "+s);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(serverSocket!=null){
serverSocket.close();
}
if(socket!=null){
socket.close();
}
if(reader!=null){
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

客户端

第一步:创建请求的Socket(需关闭)

Socket(String host,int port)

第二步:获得输出流

getOutputStream();                BufferedWriter

第三步:写数据

第四步:释放资源

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class TcpClient {
public static void main(String[] args) {
//步骤一,创建Socket对象,指定ip和端口(需要关闭)
Socket socket=null;
BufferedWriter writer=null;
try {
socket=new Socket("192.168.1.11",9999);
//步骤三,获得输出流对象,注意字节流字符流的转换
writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//步骤四,写数据
writer.write("爱我中华");
writer.newLine();//换行
writer.flush();//刷新
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(socket!=null){
socket.close();
}
if(writer!=null){
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

拓展:实现TCP从控制台输入数据

加一个BufferReader,用While(true)搭配if...breakv          

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer1 {
public static void main(String[] args) {
//步骤一,创建服务端ServerSocket对象,指定端口(需要关闭)
ServerSocket serverSocket = null;
BufferedReader reader=null;
//步骤二,创建监听接收客户端对象Socket
Socket socket=null;
try {
serverSocket= new ServerSocket(9999);

socket=serverSocket.accept();
//步骤三,获得流对象,注意字节流字符流的转换
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s=null;
//步骤四,读取数据
while (true){
if((s=reader.readLine())==null){
break;
}else{
//步骤五,获得客户端的ip地址
InetAddress inetAddress = socket.getInetAddress();
System.out.println(inetAddress.getHostAddress()+"发送的内容是:  "+s);

}
}
System.out.println("退出服务端");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(serverSocket!=null){
serverSocket.close();
}
if(socket!=null){
socket.close();
}
if(reader!=null){
reader.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class TcpClient1 {
public static void main(String[] args) {
//步骤一,创建Socket对象,指定ip和端口(需要关闭)
Socket socket=null;
BufferedWriter writer=null;
BufferedReader reader=null;
try {
socket=new Socket("192.168.1.11",9999);
String s =null;
reader=new BufferedReader(new InputStreamReader(System.in));
//步骤三,获得输出流对象,注意字节流字符流的转换
writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
while ((s=reader.readLine())!=null){
if("exit".equals(s)){
break;
}else{
//步骤四,写数据
writer.write(s);
writer.newLine();//换行
writer.flush();//刷新
}
}
System.out.println("退出客户端程序");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(socket!=null){
socket.close();
}
if(writer!=null){
writer.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

(adsbygoogle = window.adsbygoogle || []).push({});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: