案例一:
需求:
1.客户端:发送数据,接收服务器反馈
2.服务器:接收数据,给出反馈
分析:
客户端步骤:
1.创建客户端Client的Socket对象
2.发送数据
3.接受服务端Service的反馈,也就是读数据
4.释放资源
package Demo042003;
/*客户端
1.创建客户端Client的Socket对象
2.发送数据
3.接受服务端Service的反馈,也就是读数据
4.释放资源
* */
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ClientTcp {
    public static void main(String[] args) throws IOException {
        //创建客户端Client的Socket对象
        Socket s=new Socket("127.0.0.1",54638);
        //发送数据
        OutputStream ops = s.getOutputStream();
        ops.write("最美不过姑娘你".getBytes());
        //接受服务端Service的反馈,也就是读数据
        InputStream ips = s.getInputStream();
        byte[]bytes=new byte[1024];
        int len=ips.read(bytes);
        System.out.println("服务器反馈是"+new String(bytes,0,len));
        //释放资源
       s.close();
    }
}
服务端步骤:
1.创建服务端Server的ServerSocket对象
2.接收数据
3.接收成功后发出反馈,也就是写数据
4.释放资源
package Demo042003;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*服务端
1.创建服务端Server的ServerSocket对象
2.接收数据
3.接收成功后发出反馈,也就是写数据
4.释放资源
* */
public class ServerTcp {
    public static void main(String[] args) throws IOException {
        //创建服务端Server的ServerSocket对象
        ServerSocket ss = new ServerSocket(54638);
        //accept() 侦听要连接到此套接字并接受它返回一个Soket对象
        Socket s = ss.accept();
        //接收数据
        InputStream ips = s.getInputStream();
        byte[] bytes = new byte[1024];
        int len = ips.read(bytes);
        System.out.println("接收到的数据是\r\n" + new String(bytes, 0, len));
        //接收成功后发出反馈,也就是写数据
        OutputStream ops = s.getOutputStream();
        ops.write("已接受数据".getBytes());
        //释放资源
        //ss.close();
    }
}
疑问:为什么服务器接收数据时不能使用while循环接收?在使用循环接受的话会出现客户端无法收到反馈
已找到原因:客户端发送完毕后服务端还在等待接收消息,所以无法给出反馈,需要在客户端发送数据完成后使用
//定义发送完毕标记
s.shutdownOutput();
shutdownOutput()` 禁用此套接字的输出流。
使用后服务端将不再等待接收消息,继续向下执行
案例二
需求:
1.客户端:数据来源于键盘输入,直到输入的数据是over,发送数据结束
2.服务器:接收数据在控制台输出,并给出反馈
分析:与案例一基本相同,只是增加了键盘录入的部分
客户端
package Demo042005;
import java.io.*;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        Socket s=new Socket("cy",12345);
        //封装键盘录入数据
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        //封装输出流
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while ((line=br.readLine())!=null){
           if ("over".equals(line)){
               break;
           }
            //获取输出流对象
//            OutputStream ops = s.getOutputStream();
//            ops.write(line.getBytes());
            bw.write(line);
            bw.newLine();
            bw.flush(); 
        }
        //获取反馈
        InputStream ips = s.getInputStream();
        byte[]bytes=new byte[1024];
        int len;
        while ((len=ips.read(bytes))!=-1) {
            System.out.println("服务器反馈是"+new String(bytes,0,len));
        }
        //释放资源
        s.close();
    }
}
服务端
package Demo042005;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket对象
        ServerSocket ss=new ServerSocket(12345);
        //监听
        Socket s = ss.accept();
        //获取数据
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while ((line=br.readLine())!=null){
            System.out.println(line);
        }
        //接收完毕给出反馈
        OutputStream ops = s.getOutputStream();
        ops.write("已接收数据".getBytes());
        //释放资源
        ss.close();
    }
}
案例三
需求:
客户端:数据来源于键盘录入,直到输入的数据是886,发送数据停止
服务端:将接收到的数据写入文本文件
客户端
package Demo042101;
import java.io.*;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        Socket s=new Socket("cy",12345);
        //封装键盘录入数据
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        //封装写数据
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while ((line=br.readLine())!=null){
            if ("over".equals(line)){
                break;
            }
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
    }
}
服务端
package Demo042101;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket对象
        ServerSocket ss=new ServerSocket(12345);
        //监听并获取Socket对象
        Socket s = ss.accept();
        //创建要写入的文本文件对象
        FileWriter fw=new FileWriter(new File("E:\\server.txt"));
//        //创建字符输入流对象
//        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        //读取数据
      BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while ((line=br.readLine())!=null){
            fw.write(line);
            fw.flush();
            fw.close();
        }
    }
}
案例四
需求:
客户端:数据来自于文本文件
服务端:接收到的数据写入文本文件
客户端
package Demo042102;
import java.io.*;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        Socket s=new Socket("cy",12345);
        //创建读取文件对象
        BufferedReader br=new BufferedReader(new FileReader(new File("E:\\abc.txt")));
        //创建写入对象
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        //读取数据
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
    }
}
服务端
package Demo042102;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建ServerSoket对象
        ServerSocket ss=new ServerSocket(12345);
        //监听并返回Socket对象
        Socket s = ss.accept();
        //创建读取文件对象
        BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\Server.txt"));
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
    }
}
案例五
需求:
客户端:数据来自于文本文件,并接收反馈
服务端:接收到的数据写入文本文件,并给出反馈
客户端
package Demo042102;
import java.io.*;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        Socket s=new Socket("cy",12345);
        //创建读取文件对象
        BufferedReader br=new BufferedReader(new FileReader(new File("E:\\abc.txt")));
        //创建写入对象
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        //读取数据
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //结束
        s.shutdownOutput();
        //接受反馈
        BufferedReader brclinet=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String data;
        data=brclinet.readLine();
        System.out.println("服务器:"+data);
    }
}
服务端
package Demo042102;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建ServerSoket对象
        ServerSocket ss=new ServerSocket(12345);
        //监听并返回Socket对象
        Socket s = ss.accept();
        //创建读取文件对象
        BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\Server.txt"));
        BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //给出反馈
        BufferedWriter bwserver=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bwserver.write("已收到数据");
        bwserver.newLine();
        bwserver.flush();
    }
}
案例六
需求:
客户端:数据来自于文本文件,并接收反馈
服务端:接收到的数据写入文本文件,并给出反馈,代码用线程进行封装,为每一个客户端开启一个线程
ServerThread类
package Demo042103;
import java.io.*;
import java.net.Socket;
public class ServerThread implements Runnable {
    private Socket s;
    public ServerThread(Socket s) {
        this.s=s;
    }
    @Override
    public void run() {
        try {
            //写入数据
            BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\Server.txt"));
            BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
            String line;
            while ((line=br.readLine())!=null){
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
            //给出反馈
            BufferedWriter bwServer=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bwServer.write("上传文件完成");
            bwServer.newLine();
            bwServer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
客户端
package Demo042103;
import java.io.*;
import java.net.Socket;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        Socket s=new Socket("cy",12345);
        //创建读取文件对象
        BufferedReader br=new BufferedReader(new FileReader(new File("E:\\abc.txt")));
        //创建写入对象
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        //读取数据
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //结束
        s.shutdownOutput();
        //接受反馈
        BufferedReader brclinet=new BufferedReader(new InputStreamReader(s.getInputStream()));
        String data;
        data=brclinet.readLine();
        System.out.println("服务器:"+data);
    }
}
服务端
package Demo042103;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //创建ServerSoket对象
        ServerSocket ss=new ServerSocket(12345);
        while (true){
            //监听并返回Socket对象
            Socket s = ss.accept();
            //创建线程,为每一个客户端开启一个线程
            new Thread(new ServerThread(s)).start();
        }
    }
}
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号