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

【java编程】tcp/udp——Socket网络编程部分

2015-02-03 09:44 811 查看
TCP——Socket网络编程部分:

特点:1.tcp是面向连接的,连接时需要三次握手

         2.tcp适合传输大数据

             3.tcp能保证数据的完整性,传输速度稍慢

构成:1.分为客户端和服务器端

             2.客户端建立Socket服务,服务端直接使用客户端建立的Socket服务来完成数据的传输

接下来我们就来用一张图来说明,客户端和服务端的关系吧!



客户端配置的一般思路:

1.建立客户端Socket服务,并指定服务器的主机ip地址和端口号

2.如果是上传文件,要先建立相应的读取流

3.得到Socket服务的OutputStream输出流,向服务器上传文件

4.上传完毕后,设置一个标识,让服务器的读取流停下来,一般用socket服务的shutdownOutput方法

5.得到Socket服务的InputStream输入流,得到服务器返回来的信息

6.关闭资源

服务端配置的一般思路:

1.建立服务端Socket服务,指定端口号

2.得到客户端Socket服务

3.建立输出流,用于保存文件

4.得到客户端socket服务字节输入流

5.得到客户端Socket服务字节输出流

6.关闭资源

案例:1.多个用户同时上传图片到服务器上,服务器会返回上传成功

   特点:1.一般的图片字节流输入输出

     
      2.设置结束标识

      3.为每个用户创建一个线程

      4.文件的命名方式

import java.io.*;
import java.net.*;
class PicClient //客户端
{
public static void main(String[] args)
{
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("文件不是jpg文件");
return;
}
try
{
//建立Socket服务,指定主机地址和端口号
Socket s=new Socket("127.0.0.1",8800);
//建立字节读取流,读取图片
FileInputStream in = new FileInputStream(file);
//得到Socket服务输出流,上传图片
OutputStream out = s.getOutputStream();
//建立缓冲区
byte[] buf=new byte[1024];
int len=0;
while((len=in.read(buf))!=-1)
{
//System.out.println("a");
out.write(buf,0,len);
}
//设置标识符,标记图片已被读取完毕
s.shutdownOutput();
//得到Socket服务输入流,获取服务器传过来的信息
InputStream buIn = s.getInputStream();
byte[] bufIn=new byte[1024];
int num = buIn.read(bufIn);
System.out.println(new String(bufIn,0,num));
in.close();
s.close();

}
catch (IOException e)
{
throw new RuntimeException("操作失败!");
}

}
}
class PicThread implements Runnable //多线程,让每个用户获得一个线程
{
private Socket s;
PicThread(Socket s)
{
this.s=s;
}
public void run()
{
int count=1;
String ip=s.getInetAddress().getHostAddress();
try
{
System.out.println(ip+".......connection");
//创建文件对象,定义文件格式
File file = new File(ip + "("+(count)+")"+".jpg");
while(file.exists())
file=new File(ip + "("+(count++)+")"+".jpg");
//得到Socket服务输入流
InputStream in = s.getInputStream();
//建立字节输出流,保存图片
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();

}
catch (IOException e)
{
throw new RuntimeException("操作失败");
}

}
}
class PicServer //服务器端
{
public static void main(String[] args)
{
try
{
//建立serverSocket服务
ServerSocket ss=new ServerSocket(8800);
while(true)
{
//得到客户端socket服务
Socket s = ss.accept();
//为用户分配线程
new Thread(new PicThread(s)).start();
}

}
catch (IOException e)
{
throw new RuntimeException("操作失败!");
}

}
}


案例2:上传纯文本到服务器,服务器返回上传成功

特点:1.用字符缓冲区来处理纯文本

    2.设置结束标识

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
class  TextClient //客户端
{
public static void Main(String[] args) throws UnknownHostException, IOException
{
//创建Socket服务
Socket s = new Socket("127.0.0.1",8802);
//创建输入流
BufferedReader bufr = new BufferedReader(new FileReader("G:\\JavaCode\\transfer.java"));
//创建输出打印流(和BufferedWriter相似)
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufr.readLine())!=null)
{
out.println(line);
}
//添加文件结束标记
s.shutdownOutput();
//创建输入流与Socket绑定
BufferedReader bufw = new BufferedReader(new InputStreamReader(s.getInputStream()));
String data = bufw.readLine();
System.out.println(data);
}
}
class TextServer //服务器端
{
public static void Main(Strin
4000
g[] args) throws IOException
{
//创建ServerSocket服务
ServerSocket ss = new ServerSocket(8802);
//得到客户端Socket服务
Socket s = ss.accept();
//创建输入流与Socket绑定
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
//创建打印输出流,将读到的数据写到文件中
PrintWriter out = new PrintWriter(new FileWriter("G:\\server.txt"),true);
String line=null;
while((line=bufIn.readLine())!=null)
{
out.println(line);
}
//创建输出流与Socket绑定
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("上传成功!");
}
}

-----------------------------------------------------------------------------------------------------------------------------------------

UDP——Socket网络编程部分:

特点:1.udp是面向无连接的,数据包的大小限制在64K内

        2.udp是不安全的连接,会产生丢包

3.速度稍快,适合对数据完整性要求不严格的数据传输

       构成:1.服务器和客户端分别对应不同的DatagramSocket服务

      2.获取信息都要用到DatagramPacket类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Socket编程