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

Java核心---网络编程

2015-11-13 14:10 447 查看

1.网络协议

IP协议:
用于将多个包交换网络连接起来,在原地址和目的传递数据包,还提供了对数据大小重新组装的功能。
TCP协议:
是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据传输之前先是三次握手搭建通道,然后才开始传输数据。
UDP协议:
不需要建立连接,每个数据包的大小的限制,因为不用提前建立连接所以速度快,效率高,不过不够安全。



具体7层
数据格式
功能与连接方式
典型设备
应用层 Application
网络服务与使用者应用程序间的一个接口
表示层 Presentation
数据表示、数据安全、数据压缩
会话层 Session
会话层连接到传输层的映射;会话连接的流量控制;数据传输;会话连接恢复与释放;会话连接管理、差错控制
传输层 Transport
数据组织成数据段Segment
用一个寻址机制来标识一个特定的应用程序(端口号)
网络层 Network
分割和重新组合数据包Packet
基于网络层地址(IP地址)进行不同网络系统间的路径选择
路由器
数据链路层 Data Link
将比特信息封装成数据帧Frame
在物理层上建立、撤销、标识逻辑链接和链路复用 以及差错校验等功能。通过使用接收系统的硬件地址或物理地址来寻址
网桥、交换机、网卡
物理层Physical
传输比特(bit)流
建立、维护和取消物理连接
光纤、同轴电缆、

双绞线、中继器和集线器
示例(获取自己的主机IP地址):
import java.net.*;
class  GetIpDemo
{
public static void main(String[] args) throws Exception
{
InetAddress ip = InetAddress.getLocalHost();//获取本地主机IP地址对象

System.out.println(ip.getHostName()); //通过get方法获取主机名

System.out.println(ip.getHostAddress());//通过get方法获取主机地址
}
}
运行结果:



UDP协议:

Socket 就像是插座一样。是通信两端的交接处。数据就通过Socket进行传输。

示例(建立一个UDP的传送端):
/*
思路:
1 创建socket端口
2 将要发送的数据封装到包中
3 用socket端口的发送方法发送数据包
4 关闭socket服务

*/
import java.net.*;
class  UDPSendDemo
{
public static void main(String[] args) throws Exception
{
System.out.println("UDP send ...");
//使用DatagramSocket对象创建端口
DatagramSocket ds = new DatagramSocket(9999);
//要发送的数据
String str = "示例数据传输";
//封装数据
byte[] buf = str.getBytes();

DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.80.65.191"),10000);
//数据发送
ds.send(dp);
//端口关闭
ds.close();
}
}


示例(UDP接收端):
import java.net.*;
class  UDPReceDemo
{
public static void main(String[] args) throws Exception
{
System.out.println("UDP Rece ...");

DatagramSocket ds = new DatagramSocket(10000);//创建一个接受端口
while(true)//接受端打开后就循环接受数据不关闭
{
byte[] buf = new byte[1024]; //创建接受的缓冲区
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);

String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();//获取发送端的端口号
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+":"+port+":"+str);
}
}
}


运行结果:



因为UDP的高效性,所以像一般的聊天工具QQ之类的都用它。
示例(广播主机程序不点地向外播出信息);
import java.net.*;
class  Weather extends Thread //创建类,该类为多线程执行程序
{
String weather = "节目预报:晚上7点有晚会,请注意收听";
int port = 10000; //定义端口
InetAddress id = null;
MulticastSocket socket = null;  //声明多点广播套接字
Weather()throws Exception{    //构造方法
id = InetAddress.getByName("224.255.10.0");
socket = new MulticastSocket(port);  //实现化多点广播套接字
socket.setTimeToLive(1);   //指定发送范围是本地网络
socket.joinGroup(id);
}
public void run(){  //run()方法
while(true)
{
DatagramPacket packet = null;
byte data[] = weather.getBytes();
packet = new DatagramPacket(data,data.length,id,port); //打包数据
System.out.println(new String(data)); //将广播信息输出
try
{
socket.send(packet); //发送数据
sleep(3000);  //线程休眠
}
catch (Exception e)
{
e.printStackTrace();   //输出异常信息
}
}
}
public static void main(String[] args) throws Exception
{
Weather w = new Weather(); //创建本类对象
w.start();          //启动线程
}
}
运行结果:



创建UDPmessage类,它集继承了JFrame成为窗体类并实现了ActionListener接口可以处理按钮的动作处理。
该类包含多个成员变量,它们分别是信息接收文本域、信息发送文本框、IP文本框、“发送”按钮和数据报套接字。
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.*;
import javax.swing.*;
public class UDPmessage extends JFrame implements ActionListener {
private JTextArea text;
private JTextField ipText;
private JTextField sendText;
private JButton button;
private DatagramSocket socket;
private JScrollBar vsBar;
public UDPmessage() {
setTitle("UDP聊天程序");
setBounds(100, 100, 400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
text = new JTextArea();
text.setEditable(false);
JScrollPane textPanel = new JScrollPane(text);
vsBar = textPanel.getVerticalScrollBar();
add(textPanel, BorderLayout.CENTER);
JPanel panel = new JPanel();
BorderLayout panelLayout = new BorderLayout();
panelLayout.setHgap(5);
panel.setLayout(panelLayout);
ipText = new JTextField("10.80.65.191");
panel.add(ipText, BorderLayout.WEST);
sendText = new JTextField();
panel.add(sendText, BorderLayout.CENTER);
button = new JButton("发送");
panel.add(button, BorderLayout.EAST);
add(panel, BorderLayout.SOUTH);
setVisible(true);
server();
button.addActionListener(this);
}
private void server() {
try {
socket = new DatagramSocket(9527);
byte[] buf = new byte[1024];
final DatagramPacket dp1 = new DatagramPacket(buf, buf.length);
Runnable runnable = new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(100);
socket.receive(dp1);
int length = dp1.getLength();
String message = new String(dp1.getData(), 0,
length);
String ip = dp1.getAddress().getHostAddress();
if (!InetAddress.getLocalHost().getHostAddress()
.equals(ip))
text.append(ip + ":\n  " + message + "\n");
vsBar.setValue(vsBar.getMaximum());
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
new Thread(runnable).start();
} catch (SocketException e) {
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent ev) {
try {
String ip = ipText.getText();
InetAddress address = InetAddress.getByName(ip);
byte[] data = sendText.getText().getBytes();
DatagramPacket dp = new DatagramPacket(data, data.length, address,
9527);
String myip = InetAddress.getLocalHost().getHostAddress();
text.append(myip + ":\n  " + sendText.getText() + "\n");
socket.send(dp);
sendText.setText(null);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
JFrame frame = new UDPmessage();
}
}
运行结果:



TCP协议:

客户端要和服务端建立连接,形成通道(IO流),然后数据在通道内传输。
用Socket和ServerSocket建立客户端和服务端
示例(客户端):
/*
创建一个客户端思路:
1.创建客户端的Socket服务
2.获取Socket中的输出流
3.使用输出流将数据写出
*/
import java.net.*;
import java.io.*;
class  TCPClientDemo
{
public static void main(String[] args)throws Exception
{
//创建Socket端,指定地址和端口
Socket socket = new Socket("10.80.65.191",10000);
//用OutputStream流关联socket中的数据
OutputStream out = socket.getOutputStream();
//用write方法将数据写入流中
out.write("示例数据 示例数据 示例数据"getBytes());
//关闭端口
socket.close()
}
}
示例(服务端):
import java.io.*;
import java.net.*;
class  TCPServerDemo
{
public static void main(String[] args) throws Exception
{
//创建一个服务端端口
ServerSocket ss = new ServerSocket(10000);
//用accept方法就收客户端发过来的数据
Socket s = ss.accept();
//获取客户端的ip地址
String ip = s.getInetAddress().getHostAddress();
//用流关联数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
//打包数据
String text = new String(buf,0,len);
System.out.println(ip+":"+text);
//关闭端口
s.close();
ss.close();
}
}


TCP上传图片:
示例(客户端):
import java.io.*;
import java.net.*;

public class UploadPicServer
{
public static void main(String[] args) throws Exception {

//创建tcp的socket服务端。
ServerSocket ss = new ServerSocket(10000);

//获取客户端。
Socket s = ss.accept();

String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + "连接成功");

//读取客户端发来的数据。
InputStream in = s.getInputStream();

//将读取到的数据存储到一个文件中。
File dir = new File("d:\\pic");
if(!dir.exists()){
dir.mkdirs();
}
File file = new File(dir,ip + ".bmp");
FileOutputStream fos = new FileOutputStream(file);

byte[] buf = new byte[1024];

int len = 0;

while((len = in.read(buf)) != -1){
fos.write(buf,0,len);
}

//获取socket输出流,将上传成功字样发给客户端。
OutputStream out = s.getOutputStream();

out.write("上传成功".getBytes());

fos.close();
s.close();
ss.close();
}
}
TCP服务端:
import java.net.*;
import java.io.*;
public class UploadPicClient
{
public static void main(String[] args) throws Exception{

//1. 创建客户端socket。
Socket s = new Socket("10.80.65.191",10000);

//2. 读取客户端要上传的图片文件。
FileInputStream fis = new FileInputStream("d:\\1.bmp");

//3. 获取socket输出流,将读到图片数据发送给服务端。
OutputStream out = s.getOutputStream();

byte[] buf = new byte[1024];

int len = 0;

while((len = fis.read(buf)) != -1){
out.write(buf,0,len);
}

//让服务端停止读取。
s.shutdownOutput();

//读取服务端发回的内容。
InputStream in = s.getInputStream();
byte[] bufIn = new byte[1024];

int lenIn = in.read(buf);
String text = new String(buf,0,lenIn);
System.out.println(text);

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