一、网络层次模型
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;
}
}