网络编程
Java网络编程,应用方向:电商。
web编程在整个Java中占据很大一部分!
编写程序运行在同一网络下的两个终端上。
计算机网络就是:通过硬件设施、传输媒介把分散在不同地区的计算机进行连接,形成一个资源共享和数据传输的网络系统
遵循:network protocol,包含三部分,
1.语法:数据信息的结构
2.语义:描述请求、动作和响应
3.同步:动作的实现顺序
---TCP/IP、IPX/SPX、NetBEUI
TCP/IP是分层,
优点:
各层相互独立,互不干扰
维护性、扩展性好
有利于系统的标准化
分为四层,由上至下:layer
应用层:通过应用程序之间的数据交互完成网络应用
传输层:数据传输服务
网络层:IP层,网络中不同终端提供通信服务
网络接口层:数据链路层(链路协议)、物理层(传递信号的各种物理介质)
IP和端口
IP:终端设备在互联网,唯一的标示。网络中的请求可以根据这个标示找到具体的计算机。
网络地址:主机所在的网络。
主机地址:找到网络中的主机。
java.net.InetAddress :localhost 或 127.0.0.1
端口:
IP地址+端口:互联网中接收请求的服务端。
URL&URLConnection
URI:统一资源定位符指向目标实体(网络资源)
java.net.URI——实例化对象,面向对象的方式来管理网络资源。
URI.getHost()\getPort()\getPath()
URL:统一资源位置,在URI的基础上进行扩充,定位资源的同时,还提供了对应的网络地址。
java.net.URL
获取流
获取其他信息:主机地址,port等
getHost()\getPort()\getPath()
URLConnection
描述URL指定资源的连接, 抽象类,常用:HTTPURLConnection,底层通过HTTP协议来处理,定义了
访问远程网络资源的方法。
TCP协议
建立稳定的连接
Socket类,通过Socket可以在服务端和客户端之间建立起可靠的连接。Socket表示客户端,服务端使用
ServerSocket来表示,ServerSocket也是一个类,ServerSocket和Socket都存放在java.net中。
--accept
TCP协议开发——传送的是字节数组
//注意接收、发送端口问题
//本地端
//接收消息
datagramSocket = new DatagramSocket(6600);
datagramSocket.receive(datagramPacket);
String receive = new String(datagramPacket.getData());
System.out.println("Terminal A 接受到"+datagramPacket.getPort()+"端口传来的消息:"+receive);
//发送消息
String sendMeassage = "hello Termial B";
byte[] buf1 = sendMeassage.getBytes();
datagramPacket = new DatagramPacket(buf1,buf1.length,datagramPacket.getSocketAddress());
datagramSocket.send(datagramPacket);
System.out.println("Termain A 发送消息:"+sendMeassage);//服务端
//发送消息
String sendMeassage = "hello Termial A";
byte[] buf1 = sendMeassage.getBytes();
//获取接受方的地址
InetAddress inetAddress = InetAddress.getByName("localhost");
datagramPacket = new DatagramPacket(buf1,buf1.length,inetAddress,6600);
datagramSocket = new DatagramSocket(6080);
datagramSocket.send(datagramPacket);
System.out.println("Termain B 发送消息:"+sendMeassage);
//接收消息
datagramSocket.receive(datagramPacket);
String receive = new String(datagramPacket.getData());
System.out.println("Terminal B 接受到"+datagramPacket.getPort()+"消息:"+receive);
UDP应用
//A:客户端
Socket socket = new Socket("127.0.0.1", 8080);
//发送请求
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
String request = "客户端请求信息:hello server http ip";
dataOutputStream.writeUTF(request);
//接受请求
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String response = dataInputStream.readUTF();
System.out.println("客户端获得响应信息:"+response);
//B:服务端
serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();//这块会出现丢包问题
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String receive = dataInputStream.readUTF();
System.out.println("服务端接收到消息:"+receive);
//反馈
String response = "hello client:protocal TCP\\IP";
OutputStream outputStream = socket.getOutputStream();
//outputStream.write(response.getBytes());
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(response);
System.out.println("服务端给客户端作出响应:"+response);
不知道:总感觉还是差点业务上的实际应用!【自学当中出现的困惑点:需要不断实践才能沉淀处真知灼见!】——碰到高人指点是一定要感恩回报的!
体会这种封装的思想——简单的聊天程序
【1】明白是两个线程进行通话
【2】采用UDP协议,客户端Socket对象,服务端ServerSocket对象
【3】简单两个线程之间通话,多个线程的问题???
//客户端代码
public class Client implements Runnable{
private Socket socket;
public Client(Socket socket) {
// TODO Auto-generated constructor stub
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
//线程本身一直在监听,而不是重新启动线程!!
//客户端发送消息
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
Scanner scanner = new Scanner(System.in);
System.out.print("客户端:");
String string=scanner.nextLine();
//System.out.println(string);
dataOutputStream.writeUTF(string);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//客户端接收消息
try {
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String receive = dataInputStream.readUTF();
System.out.println("服务端:"+receive);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}//服务端代码
public class Server extends Thread{
private ServerSocket serverSocket;
public Server(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
@Override
public void run() {
// TODO Auto-generated method stub
//super.run();
try {
Socket socket = serverSocket.accept();
while (true) {
String receive = new DataInputStream(socket.getInputStream()).readUTF();
System.out.println("客户端:"+receive);
Scanner scanner = new Scanner(System.in);
System.out.print("服务端:");
String response = scanner.nextLine();
//System.out.println(response);
new DataOutputStream(socket.getOutputStream()).writeUTF(response);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}//客户端线程调用
Socket socket = null;
Thread q1 = null;
try {
socket = new Socket("localhost", 8080);
Client client = new Client(socket);
q1 = new Thread(client);q1.start();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//服务端线程调用
Server server = null;
try {
server = new Server(new ServerSocket(8080));server.start();
} catch (IOException e) {
e.printStackTrace();
}注意一点:java.net.ConnectException: Connection refused: connect 原因:
Socket socket = serverSocket.accept();//服务端需要先建立连接