OSI七层与TCP/IP4层
TCP/IP4层 | OSI七层 | 协议 |
应用层 | 应用层 | Telnet、FTP、HTTP、DNS、SMTP、POP3 |
表示层 | ||
会话层 | ||
传输层 | 传输层 | TCP、UDP |
网络层 | 网络层 | IP、ICMP、IGMP |
网络接口层 | 数据链路层 | |
物理层 |
TCP与UDP比较
TCP | UDP | |
是否连接 | 面向连接的 | 面向非连接的 |
传输可靠性 | 可靠的 | 不可靠的 |
应用场合 | 1、数据完整性要求高的传输 2、传输大量的数据(大小没有限制) 如:安装文件下载等 | 1、实时性要求高,丢失部分数据也无关紧要的传输 2、少量数据(有限制,每次不超过64K) 如:视频会议等 |
速度 | 慢 | 快 |
Socket与TCP、UDP
1、TCP实现
package myjava.net.socket.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Dependent on TCP protocol<br>
* 1.MultiThread for server socket.<br>
* 2.Create a new thread when accept a client socket.<br>
*
* @author jeck.xie 2009-3-25
*/
public class SocketTCP extends Thread {
private Socket s;
public SocketTCP(Socket s) {
this.s = s;
}
@Override
public void run() {
try {
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
os.write("Hello,welcome you!".getBytes());
byte[] buf = new byte[100];
int len = is.read(buf);
System.out.println(new String(buf, 0, len));
os.close();
is.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
if (args.length > 0)
server();
else
client();
}
public static void server() {
try {
ServerSocket ss = new ServerSocket(6000);
while (true) {
Socket s = ss.accept();
new SocketTCP(s).start();
}
// ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void client() {
try {
Socket s = new Socket(InetAddress.getLocalHost(), 6000);
OutputStream os = s.getOutputStream();
InputStream is = s.getInputStream();
byte[] buf = new byte[100];
int len = is.read(buf);
System.out.println(new String(buf, 0, len));
os.write("Hello,this is zhangsan!".getBytes());
os.close();
is.close();
s.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.UDP实现
package myjava.net.socket.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* Dependent on UDP protocol<br>
*
* @author jeck.xie 2009-3-25
*/
public class SocketUDP {
public static void main(String[] args) {
if (args.length > 0)
recv();
else
send();
}
public static void recv() {
try {
DatagramSocket ds = new DatagramSocket(6000);
// accept data
byte[] buf = new byte[100];
DatagramPacket dp = new DatagramPacket(buf, 100);
ds.receive(dp);
System.out.println(new String(buf, 0, 100));
// send data
String str = "Welcome you!";
DatagramPacket dpSend = new DatagramPacket(str.getBytes(), str
.length(), dp.getAddress(), dp.getPort());
ds.send(dpSend);
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void send() {
try {
DatagramSocket ds = new DatagramSocket();
// send data
String str = "Hello, this is zhangsan!";
DatagramPacket dp = new DatagramPacket(str.getBytes(),
str.length(), InetAddress.getLocalHost(), 6000);
ds.send(dp);
// accept data
byte[] buf = new byte[100];
DatagramPacket dbRecv = new DatagramPacket(buf, 100);
ds.receive(dbRecv);
System.out.println(new String(buf, 0, 100));
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}