------------------android培训、 java培训、期待与您交流!-------------------
网络编程2
昨天主要讲述了UDP连接,今天再讲讲TCP连接
在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换。TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制。一个端点由 IP 地址和端口构成(专业术语为“元组 {IP 地址, 端口}”)。这样,一个连接就可以由元组 {本地地址, 本地端口, 远程地址, 远程端口} 来表示。
连接过程
在 TCP编程接口中,端点体现为 TCP 套接字。共有两种 TCP 套接字:主动和被动,“被动”状态也常被称为“侦听”状态。服务器和客户端利用套接字进行连接的过程如下:
1、服务器创建一个被动套接字,开始循环侦听客户端的连接。
2、客户端创建一个主动套接字,连接服务器。
3、服务器接受客户端的连接,并创建一个代表该连接的主动套接字。
4、服务器和客户端通过步骤 2和 3 中创建的两个主动套接字进行数据传输。
下面演示一个上传图片至服务器的小程序:
客户端:
package it.sun.day4;
import java.io.*;
import java.net.*;
publicclass PicClient {
publicstaticvoid main(String[] args)throws UnknownHostException,IOException {
if(args.length!=1){
System.out.println("请选择一个jpg格式的图片");
return;
}
File file = new File(args[0]);
if(!(file.exists()&& file.isFile())){
System.out.println("该文件有问题");
return;
}
if(!file.getName().endsWith(".jpg")){
System.out.println("图片格式有误!");
return;
}
if(file.length()>10*1024*1024){
System.out.println("图片过大");
return;
}
Socket s = new Socket("localhost",10000);
FileInputStream fis = new FileInputStream(file);
OutputStream out =s.getOutputStream();
byte[] buf =newbyte[1024];
int len = 0;
while((len=fis.read(buf))!=-1)
{
out.write(buf, 0, len);
}
//告诉服务端,数据已写完
s.shutdownOutput();
InputStream in = s.getInputStream();
byte[] bufIn =newbyte[1024];
int num =in.read(bufIn);
System.out.println(new String(bufIn,0,num));
fis.close();
s.close();
}
}
服务端:
package it.sun.day4;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;;
class PicThreadimplements Runnable{
private Sockets;
public PicThread(Socket s) {
this.s = s;
}
publicvoid run(){
int count = 1;
String ip = s.getInetAddress().getHostAddress();
try{
System.out.println(ip+"-----connected");
InputStream in = s.getInputStream();
File file = new File(ip+"("+(count++)+")"+".jpg");
while(file.exists())
file = new File(ip+"("+(count++)+")"+"jpg")
FileOutputStream fos = new FileOutputStream(file);
byte[] buf =newbyte[1024];
int len = 0;
while((len=in.read(buf))!=-1){
fos.write(buf,0,len);
}
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
}catch(Exception e){
throw new RuntimeException(ip+"上传失败!");
}
}
}
class PicServer{
publicstaticvoid main(String[] args)
{
ServerSocket ss = null;
try {
ss = new ServerSocket(10000,10);
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
while(true){
Socket s = null;
try {
s = ss.accept();
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
new Thread(new PicThread(s)).start();
}
}
}
------------------android培训、 java培训、期待与您交流!-------------------