Java基础-TCP传输

TCP传输
Socket和ServerSocket
建立客户端和服务器端,建立连接后,通过Socket中的IO流进行数据传输,

关闭Socket,同样,服务器端和客户端是两个独立的应用程序。

代码:

/*
需求:给服务器端发送一个文本数据
步骤:
1.创建Socket服务,并指定要连接的主机和端口
*/
import java.net.*;
import java.io.*;
class  TcpSocket
{
    public static void main(String[] args) 
    {
        try
        {
            //创建客户端的Socket服务,指定目的主机和端口
            Socket s=new Socket("127.0.0.1",10000);

            //为了发送数据,应该获取Socket中的输出流。
            OutputStream out=s.getOutputStream();

            out.write("hahaha".getBytes());
            s.close();

        }
        catch (Exception e)
        {
            throw new RuntimeException("客户端建立失败!");
        }
        

    }
}
/*
需求:定义端点接收数据并打印在控制台。
服务端:
1.建立服务端的socket服务,ServerSocket();
并监听一个端口
2.获取连接过来的客户端对象。
通过ServerSocket的accept方法。
没有连接,就一直等待,所以这是一个阻塞式方法。
3.客户端如果发送来数据,那么服务端要使用对应的客户端对象,并获取到该客户端
对象的读取流来读取发过来的数据。
4.关闭服务端。
*/
class TcpServer 
{
    public static void main(String[] args) 
    {
        try
        {
        ServerSocket ss=new ServerSocket(10000);
        Socket s=ss.accept();
        String ip=s.getInetAddress().getHostAddress();
        
        InputStream in=s.getInputStream();
        byte[] buf=new byte[1024];
        int len=in.read(buf);
        System.out.print(ip+":");
        System.out.println(new String(buf,0,len));

        s.close();
            
        }
        catch (Exception e)
        {
            throw new RuntimeException("服务端建立失败!");
        }

        
    }
}
TCP的传输的客户端和服务端的互访
需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。

客户端:
1.建立socket服务。指定要连接主机和端口。
2.获取socket流中的输出流。将数据写到该流中,通过网络发送给服务端。
3.获取socket流中的输入流,将服务器反馈的数据获取到,并打印。

4.关闭客户端。

代码:

import java.net.*;
import java.io.*;
class TcpClient2 
{
    public static void main(String[] args) 
    {
        try
        {
            Socket s=new Socket("192.168.1.255",10000);
            OutputStream os=s.getOutputStream();
            os.write("你好啊,服务端!".getBytes());
        
            byte[] buf=new byte[1024];
            InputStream is=s.getInputStream();
            int len=is.read(buf);
            System.out.println(new String(buf,0,len));
            s.close();
        }
        catch (Exception e)
        {
            throw new RuntimeException("客户端建立失败!");
        }

    }
}
class TcpServer2
{
    public static void main(String[] args) 
    {
        try
        {
            ServerSocket ss=new ServerSocket(10000);
            Socket s=ss.accept();

            InputStream is=s.getInputStream();
            byte[] buf=new byte[1024];
            int len=is.read(buf);
            System.out.println(s.getInetAddress().getHostAddress()+"::"+new String(buf,0,len));

            OutputStream os=s.getOutputStream();
            os.write("你也好,欢迎光临!".getBytes());

            s.close();
            ss.close();

            
        }
        catch (Exception e)
        {
            throw new RuntimeException("服务端建立失败!");
        }
    }
}
TCP练习:
需求:建立一个文本形式转换服务器。
客户端给服务端发送文本,服务端会将文本转换成大写再返回给服务端。
而且,客户端可以不断地进行文本发送,当客户端输入over时,转换结束。

分析:
客户端:
既然是操作设备上的数据,那么就可以使用io技术,并且按照io的操作规律来思考。
源:键盘录入
目的:网络设备,网络输出流
而且操作的是文本数据,可以选择字符流。

步骤:
1.建立服务
2.获取键盘录入
3.将数据发送给服务端
4.接受服务端返回的大写数据
5.结束,关闭资源。

代码:

import java.net.*;
import java.io.*;
class  TransClient
{
    public static void main(String[] args) throws Exception
    {
        //建立socket服务
        Socket s=new Socket("192.168.1.255",10000);
        //获取键盘录入
        BufferedReader bufr=
            new BufferedReader(new InputStreamReader(System.in));
        //向服务端发送数据
        BufferedWriter bufOut=
            new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line=null;
        //接受服务端返回的数据
        BufferedReader bufIn=
            new BufferedReader(new InputStreamReader(s.getInputStream()));
        while((line=bufr.readLine())!=null)
        {
            if("over".equals(line))
                break;
            bufOut.write(line);
            bufOut.newLine();
            bufOut.flush();
            
            String str=bufIn.readLine();
            System.out.println("server:"+str);
        }
        bufr.close();
        s.close();                   
    }
}
class  TransServer
{
    public static void main(String[] args) throws Exception
    {
        //建立服务
        ServerSocket  ss=new ServerSocket(10000);
        Socket s=ss.accept();
        
        //接受客户端的数据
        BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));

        //返回给客户端大写的文本
        BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

        String line=null;

        while((line=bufIn.readLine())!=null)
        {
            System.out.println(line);
            bufOut.write(line.toUpperCase());
            bufOut.newLine();
            bufOut.flush();
        }   
        ss.close(); 
    }
}

TCP复制文件:从客户端向服务端上传文件。

代码:

import java.net.*;
import java.io.*;
class  TextClient
{
    public static void main(String[] args) throws Exception
    {
        Socket s=new Socket("192.168.1.255",10006);
        BufferedReader bufr=
            new BufferedReader(new FileReader("ChatDemo.java"));
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);
        String line=null;
        while((line=bufr.readLine())!=null)
        {
            out.println(line);
        }
        s.shutdownOutput();
        BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String  str=bufIn.readLine();
        System.out.println("server:"+str);
        bufr.close();
        s.close();     
    }
}
class  TextServer
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss=new ServerSocket(10006);
        Socket s=ss.accept();
        System.out.println(s.getInetAddress().getHostAddress()+"....connected");
        BufferedReader bufIn=
            new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintWriter out=new PrintWriter(new FileWriter("server.txt"),true);
        String line=null;
        while((line=bufIn.readLine())!=null)
        {
            out.println(line);
        }
        PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
        pw.println("上传成功!");

        s.close();
        ss.close();
        out.close();
    }
}

TCP上传图片:

 代码:

import java.net.*;
import java.io.*;
class PicClient  
{
    public static void main(String[] args) throws Exception
    {
        Socket s=new Socket("192.168.1.255",10007);
        FileInputStream fis=new FileInputStream("E:\\图\\素材\\头像.jpg");
        OutputStream os=s.getOutputStream();
        byte[] buf=new byte[1024*16];
        int len;
        while((len=fis.read(buf))!=-1)
        {
            os.write(buf,0,len);
        }
        //告诉服务器数据写入完毕
        s.shutdownOutput();
        InputStream is=s.getInputStream();
        byte[] bufIn=new byte[1024];
        int num=is.read(bufIn);
        System.out.println(new String(bufIn,0,num));
        
        fis.close();
        s.close();   
    }
}
class  PicServer 
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss=new ServerSocket(10007);
        Socket s=ss.accept();
        System.out.println(s.getInetAddress().getHostAddress()+"......connected");
        InputStream in=s.getInputStream();
        byte[] buf=new byte[1024*16];
        FileOutputStream fos=new FileOutputStream("touxiang.jpg");
        int len;
        while((len=in.read())!=-1)
        {
            fos.write(buf,0,len);
        }
        PrintWriter out=new PrintWriter(s.getOutputStream(),true);
        out.println("图片上传成功!");

        fos.close();
        s.close();
        ss.close();        
    }
}



部分代码转载于:http://www.cnblogs.com/wsw-tcsygrwfqd/p/5131781.html

                           http://www.cnblogs.com/wsw-tcsygrwfqd/p/5143524.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值