现在的位置: 首页 > 综合 > 正文

第十八章 网络编程

2013年07月08日 ⁄ 综合 ⁄ 共 4632字 ⁄ 字号 评论关闭
文章目录

一、网络层次模型

OSI模型                                                                            TCP/IP模型

应用层:应用程序

表示层:数据处理,编解码,解压缩,格式转换

会话层:进程通信和,数据同步                                  应用层:

传输层:传递数据segment和datagram                    传输层:

网络层:路由及包packet                                              网络互联层:

数据链路层:帧传输frame                                           网络接口层:

物理层:物理连接,bit                            

二、TCP/IP协议套接字

服务器端ServerSocket和客户端Socket

需要目标IP地址和端口号,协议为TCP协议。

服务器端采用accept方法返回一个套接字,该端口不再是服务器侦听端口。

还可以设置超时时间,其他端口,地址什么的,可以获得输入输出流。传递数据

三、UDP套接字

DatagramSocket,可以用来发送和接收用户报文。

数据包DatagramPacket(数据字节数组,长度,目标IP,目标端口)用来发送的包

数据包DatagramPacket(数据字节数组,长度)用来接收的包

send(packet),和receive(packet)方法来接收发送数据包。

四、URL使用

URL的组成:

协议://主机名:端口/路径?查询字符串#描点引用

new URL(协议,主机IP,端口,文件)

方法有很多:

openConnection()打开连接,可以与URL进行通信

setDoInput(true),设置可以进行输入,一般默认true。

setDoOutput(true),设置可以进行输出,一般默认false。

还有其他的到路径,文件;主机名,授权;端口号,默认端口号;协议;查询;描点;输入流;输出流

 

列子:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ConnectException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import javax.swing.JOptionPane;


public class Client implements ActionListener{
	private static String name ;//服务器名字,就是本机名字
	private MyFrame father;
	private int buffSize;
	
	public Client(){
		
	}
	
	public Client(int buffSize,MyFrame father){
		this.buffSize = buffSize;
		this.father = father;
		System.out.println("客户端:"+this.name+" 启动");
	}

	@Override
	public void actionPerformed(ActionEvent ex) {
		// TODO Auto-generated method stub
		Socket socket = null;
		String ip = father.getIpTxt().getText();
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		byte[] b = new byte[this.buffSize];
		int length = 0;
		try{
			socket = new Socket(ip,9527);
			//发送文件,并且不是键盘输入enter
			if(ex != null && ex.getActionCommand().equals("发文件")){
				String inputFilePath = father.getFilePathTxt().getText();
				
				if(!"filepath\file".equals(inputFilePath) || "".equals(inputFilePath)){
					
					File file = new File(inputFilePath);
					if(file.isFile()){
						FileInputStream fis = new FileInputStream(file);
						bis =new BufferedInputStream(fis);
						bos = new BufferedOutputStream(socket.getOutputStream());
						this.father.getMessageArea().append("开始传送文件:"+file.getName()+"\n");
						//写入传送文件标志位0
						bos.write(0);
						//写入文件名
						bos.write(file.getName().getBytes("utf-8"));
						//写入文件名结束标志位0
						bos.write(0);
						//正式传送文件内容
						while((length = bis.read(b)) != -1 ){
							bos.write(b,0,length);
							bos.flush();
//							System.out.println("传送的数据:"+new String(b,0,length));
						}
						//文件发送完成
						this.father.getMessageArea().append("传送完成:"+file.getName()+"\n");
						father.getFilePathTxt().setText("filepath\\file");
					}
						else{
						//文件路径错误
						this.father.getMessageArea().append("文件路径错误,找不到文件"+"\n");
					}
				}
			}else{
				//本次操作是发送消息
					try {
						String message = this.father.getMessageTxt().getText();
						bos = new BufferedOutputStream(socket.getOutputStream());
						if(!"".equals(message)){
							//发消息,首先写标志位为1
							bos.write(1);
							Date now  = new Date();
							SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
							this.father.getMessageArea().append("我自己: "+sdf.format(now).substring(10)+"\n"+message+"\n");
							this.father.getIpTxt().setText("192.168.1.126");
							this.father.getMessageTxt().setText("");
							//用utf-8来编码信息
							byte[] by = (this.name+"&"+sdf.format(now)+"&"+message).getBytes("utf-8");
							//将信息写入到socket
							bos.write(by);
							bos.flush();
						}else{
							JOptionPane.showMessageDialog(null, "不能发送空信息!");
						}
						father.getMessageArea().setCaretPosition(father.getMessageArea().getText().length());
						
					} catch (UnknownHostException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
		}catch(UnknownHostException ukh){
			System.out.println(father.getIpTxt().getText()+"--是无效IP");
			father.getMessageArea().append(father.getIpTxt().getText()+"--是无效IP\n");
		}
		catch(ConnectException et){
			System.out.println("无法连接目标IP");
			father.getMessageArea().append("无法连接目标IP\n");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(socket != null){
				try {
					socket.close();
				} catch (IOException e2) {
					// TODO Auto-generated catch block
					e2.printStackTrace();
				}
			}
			if(bos != null){
				try {
					bos.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			if(bis != null){
				try {
					bis.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
	}

	public int getBuffSize() {
		return buffSize;
	}

	public void setBuffSize(int buffSize) {
		this.buffSize = buffSize;
	}

	public static String getName() {
		return name;
	}

	public static void setName(String name) {
		Client.name = name;
	}
	
}

 

抱歉!评论已关闭.