Java_TCP通信_Socket_(IO流的使用)

客户端

第一种方式

package demo;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    static Socket socket;
    static String serverHost = "192.168.1.70";//服务器端的ip地址

    static int serverPort = 8003;//服务器端的端口号

    public static void main(String[] args)throws IOException {

        try{
            System.out.println("正在连接");
            socket = new Socket(serverHost, serverPort);//请求连接,连接的目的服务器的ip和端口号要作为参数
            try {
                System.out.println("连接成功");
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

                Scanner scanner = new Scanner(System.in);

                //第一种读取数据的方式
                InputStream in = socket.getInputStream();
                OutputStream out = socket.getOutputStream();
                byte [] buf = new byte[1024];
                int line = 0;
                while ((line=in.read(buf)) !=-1){

                    System.out.print(new String(buf,0,line));
                    String s = scanner.nextLine();

                    out.write(("客户端:"+s+"\n").getBytes());
                    System.out.println("客户端: "+s);
                }

                //第二种读取方式
//                String r = "";
//                while ((r = bufferedReader.readLine())!=null){ //readLine()只能读取\n、\r结尾的数据
//                    System.out.println(r);//读取一行服务器端写入的文本,注意文本要以换行符或者回车结尾
//                }

            }finally {
                socket.close();
            }
        }catch (Exception e){
            System.out.println("连接失败");
        }

    }
}

服务端

package demo;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
    private static int port = 8003;//设置端口号

    public static void main(String[] args)throws IOException {

        try{
            ServerSocket serverSocket = new ServerSocket(port);//第一步设置服务器端口号
            System.out.println("等待连接....");

            Socket socket = serverSocket.accept();//第二步等待客户端发送连接请求
            System.out.println("客户端已连接成功");

            try {
                //第三步创建和客户端的的输入输出对象
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

                Scanner in= new Scanner(System.in);

                String s = null;
                while ((s = in.nextLine()) != null){

                    System.out.println("服务器:"+s);
                    bufferedWriter.write("服务器:"+s+"\n"); //加入\n 是因为readLine()方法需要 读到\n、\r、\n\r才能输出数据
                    bufferedWriter.flush(); //一定要刷新才能发送成功

                    String read = bufferedReader.readLine();
                    System.out.println(read);
                }

            }finally {
                serverSocket.close();
                socket.close();
            }

        }catch (Exception e){
            System.out.println("连接失败");
            e.printStackTrace();

        }

    }
}

第二种方式

服务端

package test;

import java.io.DataInputStream; //导入 DataInputStream类
import java.io.DataOutputStream;//导入DataOutputStream类 
import java.io.IOException;//导入IOException类
import java.net.ServerSocket;//导入ServerSocket类   
import java.net.Socket; //导入Socket 类 
import java.util.Scanner; //导入Scanner类

/** 
 * 模拟qq聊天功能: 实现客户端与服务器(一对一)的聊天功能,客户端首先发起聊天,输入的内容在服务器端和客户端显示, 
 * 然后服务器端也可以输入信息,同样信息也在客户端和服务器端显示 
 */  

// 服务器类  
public class ChatServer {//ChatServer类  
    private int port = 8003;// 默认服务器端口

    public ChatServer() {

    }  

    // 创建指定端口的服务器  
    public ChatServer(int port) {//构造方法  
        this.port = port;//将方法参数赋值给类参数  
    }  

    // 提供服务  
    public void service() {//创建service方法  
        try {// 建立服务器连接
            System.out.println("正在连接...");
            ServerSocket server = new ServerSocket(port);//创建  ServerSocket类             
            Socket socket = server.accept();// 等待客户连接
            System.out.println("连接成功");
            try {                  
                DataInputStream in = new DataInputStream(socket  
                        .getInputStream());// 读取客户端传过来信息的DataInputStream                   
                DataOutputStream out = new DataOutputStream(socket  
                        .getOutputStream());// 向客户端发送信息的DataOutputStream                     
                Scanner scanner = new Scanner(System.in);//从键盘接受数据
                while (true) {                       
//                    String accpet = in.readUTF();// 读取来自客户端的信息
//                    System.out.println(accpet);//输出来自客户端的信息
                    String send = scanner.nextLine();//nextLine方式接受字符串
                    out.writeUTF("服务器:" + send);//把服务器端的输入发给客户端
                }  
            } finally {// 建立连接失败的话不会执行socket.close();
                socket.close();//关闭连接 
                server.close();//关闭                
            }  
        } catch (IOException e) {//捕获异常
            System.out.println("连接失败");
            e.printStackTrace();  
        }  
    }  

    public static void main(String[] args) {//主程序方法  
        new ChatServer().service();//调用 service方法 
    }  
}  

客户端

package test;

import java.io.DataInputStream;//导入DataInputStream类
import java.io.DataOutputStream;//导入DataOutputStream
import java.io.IOException;//导入IOException类
import java.net.Socket;//导入Socket类
import java.util.Scanner;//导入Scanner类

/**
 * 注意用到的输入输出流DataInputStream和DataOutputStream,成对出现,最好用字节流
 */
// 客户端类
public class ChatClient {//创建公共类
    private String host = "192.168.1.70";// 默认连接到本机
    private int port = 8003;// 默认连接到端口8189

    public ChatClient() {

    }

    // 连接到指定的主机和端口
    public ChatClient(String host, int port) {//构造方法
        this.host = host;//将构造方法的参数host传递给类变量host
        this.port = port;//将构造方法的参数port传递给类变量port
    }

    public void chat() {//chat方法
        try {
            // 连接到服务器
            System.out.println("正在连接....");
            Socket socket = new Socket(host, port);//创建Socket类对象

            try {

                DataInputStream in = new DataInputStream(socket
                        .getInputStream());// 读取服务器端传过来信息的DataInputStream
                System.out.println("连接成功");
                DataOutputStream out = new DataOutputStream(socket
                        .getOutputStream());// 向服务器端发送信息的DataOutputStream


                Scanner scanner = new Scanner(System.in);// 装饰标准输入流,用于从控制台输入

                while (true) {
//                    String send = scanner.nextLine();//读取控制台输入的内容
//                    System.out.println("客户端:" + send);//输出键盘输出内容提示 ,也就是客户端向服务器端发送的消息
//                    // 把从控制台得到的信息传送给服务器
//                    out.writeUTF("客户端:" + send);//将客户端的信息传递给服务器
                    String accpet = in.readUTF();// 读取来自服务器的信息
                    System.out.println(accpet);//输出来自服务器的信息
                }

            } finally {
                socket.close();//关闭Socket监听
            }
        } catch (IOException e) {//捕获异常
            System.out.println("连接失败");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {//主程序方法
        new ChatClient().chat();//调用chat方法
    }
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值