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

网络编程概述及实例练习

2017-10-12 21:57 120 查看

一、网络编程概述

1.网络模型

计算机网络之间以何种规则进行通信,就是网络模型研究问题。
网络模型一般是指OSI(OpenSystem Interconnection开放系统互连)参考模型
TCP/IP参考模型




二、网络编程三要素

1.IP地址:InetAddress

网络中设备的标识,不易记忆,可用主机名
要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机,在TCP/IP协议中,这个标识号就是IP地址。


那么,我们如果获取和操作IP地址呢?

为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用。

没有构造方法,那么如何使类提供的功能呢?

要掌握的功能

获取任意主机:getByName

主机名:getHostName
主机Ip地址:getHostAddress


2.端口号

用于标识进程的逻辑地址,不同进程的标识


物理端口 网卡口

逻辑端口 我们指的就是逻辑端口

A:每个网络程序都会至少有一个逻辑端口

B:用于标识进程的逻辑地址,不同进程的标识
C:有效端口:0~65535,其中0~1024系统使用或保留端口。

通过360可以查看端口号

3.传输协议

通讯的规则
常见协议:TCP,UDP


三、UDP编程

1.UDP

将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快。




2.UDP编程小例子

(1).多线程实现eclipse下显示UDP通信

ChatRomm.java

package cn.itcast_05;

import java.io.IOException;
import java.net.DatagramSocket;

public class ChatRoom {
public static void main(String[] args) throws IOException {
DatagramSocket dsSend = new DatagramSocket();
DatagramSocket dsReReceive = new DatagramSocket(12306);

SendThread st = new SendThread(dsSend);
ReceiveThread rt = new ReceiveThread(dsReReceive);

Thread t1 = new Thread(st);
Thread t2 = new Thread(rt);
t1.start();
t2.start();

}
}

----------

ReceiveThread.java
package cn.itcast_05;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveThread implements Runnable {
private DatagramSocket dsReceive;
public ReceiveThread(DatagramSocket dsReceive) {
this.dsReceive = dsReceive;
}

@Override
public void run() {
// TODO Auto-generated method stub
try {
while (true) {
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
dsReceive.receive(dp);
String ip = dp.getAddress().getHostAddress();
String s = new String(dp.getData(), 0, dp.getLength());
System.out.println("from  " + ip + "  data is: " + s);
}
} catch (IOException e) {
// TODO: handle exception
}
}
}

----------

SendThread.java
package cn.itcast_05;

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 SendThread implements Runnable {
private DatagramSocket dsSend;
public SendThread(DatagramSocket dsSend) {
this.dsSend = dsSend;
}

@Override
public void run() {
// TODO Auto-generated method stub
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.1.103"),
12306);
dsSend.send(dp);
}
dsSend.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}

}


四、TCP编程

1.TCP

建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。


2.TCP编程小例子



UserThread.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class UserThread implements Runnable {
private Socket s;

public UserThread(Socket s) {
this.s = s;
}

@Override
public void run() {
try {
// 封装通道内的流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String newName = System.currentTimeMillis() + ".java";
BufferedWriter bw = new BufferedWriter(new FileWriter(newName));

String line = null;
while ((line = br.readLine()) != null) { // 阻塞
bw.write(line);
bw.newLine();
bw.flush();
}

// 给出反馈
BufferedWriter bwServer = new BufferedWriter(
new OutputStreamWriter(s.getOutputStream()));
bwServer.write("文件上传成功");
bwServer.newLine();
bwServer.flush();

// 释放资源
bw.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

----------
UploadClient.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class UploadClient{
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket("192.168.1.103", 11111);

// 封装文本文件
// BufferedReader br = new BufferedReader(new FileReader(
// "InetAddressDemo.java"));
BufferedReader br = new BufferedReader(new FileReader(
"a.txt"));
// 封装通道内流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));

String line = null;
while ((line = br.readLine()) != null) { // 阻塞
bw.write(line);
bw.newLine();
bw.flush();
}

// Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了
s.shutdownOutput();

// 接收反馈
BufferedReader brClient = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String client = brClient.readLine(); // 阻塞
System.out.println(client);

// 释放资源
br.close();
s.close();
}
}

----------
UploadServer.java

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadServer {
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(11111);

while (true) {
Socket s = ss.accept();
new Thread(new UserThread(s)).start();
}
}
}


五、Socket

Socket套接字:

网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。


Socket原理机制:

通信的两端都有Socket。网络通信其实就是Socket间的通信。数据在两个Socket间通过IO传输。




InetAddress类的使用

获取任意主机:getByName
主机名:getHostName
主机Ip地址:getHostAddress
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息