socket编程(一),实现服务器与客户端简单通信

本节主讲客户端向服务发送信息,服务器转发给客户端,当然也可以稍微改一下代码可以实现互传消息,不再赘述。
难点在于服务器端的代码思路:
(1)主程序Socket socket=server.accept();等待客户端连接。
(2)创建线程函数,实现连接成功后创建一个新的线程,服务器转发客户端消息。
TCPServer.java

package com.ysu.server.chatroom;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class TCPServer  { 
    private int port=4443;//默认服务器端口
    public void setPort(int port){
        this.port=port;
    }
    public int getPort(){
        return this.port;
    }
    public void servers(){
        try {
            ServerSocket server=new ServerSocket(this.getPort());
            int i=0;
            while(true){
                //等待客户端连接
                Socket socket=server.accept();
                i++;
                System.out.println("第"+i+"个客户端连接!");
                //连接成功后创建一个新的线程实现服务器通信服务
                new Thread(new ThreadServer(socket)).start();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws IOException  {
        new TCPServer().servers();
    }

}

ThreadServer.java

package com.ysu.server.chatroom;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ThreadServer implements Runnable{
    private Socket socket;

    public ThreadServer(Socket socket){
        this.socket=socket;

    }
    public Socket getSocket(){
        return this.socket;
    }
    //多线程运行函数
    public void run() {
        BufferedReader in= null;
        PrintWriter write = null;
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        try {
            //获取输出流
            write=new PrintWriter(this.socket.getOutputStream());
            //获取输入流
            in=new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            String str=in.readLine();

            while(!(str==null||str.equals("end")||str.equals(""))){             
            System.out.println(str);
            write.println("服务器(转)"+str);
            write.flush();//强制刷新缓冲区,将缓冲区全部输出
            str=in.readLine();
            }   

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                //关闭流
                write.close();
                in.close();
                this.getSocket().close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}

以上是服务器端的代码,下面是客户端代码比服务器简单。
TCPClient1.java

package com.ysu.server.chatroom;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class TCPClient1 {

    public static void main(String[] args) {
        try {
            Socket socket=new Socket("127.0.0.1",4443);
            System.out.println("客户1:服务已经连接......");
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            PrintWriter write=new PrintWriter(socket.getOutputStream());
            BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //System.out.println(in.readLine());
            String line=br.readLine();
            //System.out.println(line);
            while(!line.equals("end")){
                //System.out.println(line);
                write.println("客户端1:"+line);
                write.flush();
                System.out.println(in.readLine());
                line=br.readLine();
            }
            write.close();
            in.close();
            br.close();
            socket.close();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行效果图:
这里写图片描述

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Socket编程是一种网络编程技术,它可以实现客户端服务器之间的通信。在Socket编程中,客户端服务器通过套接字(Socket)建立连接,然后通过Socket发送和接收数据。 客户端服务器之间的通信可以分为两种方式:TCP和UDP。TCP是一种可靠的连接协议,它可以保证数据的可靠传输,但是速度较慢。UDP是一种不可靠的连接协议,它可以快速传输数据,但是数据的可靠性不如TCP。 在Socket编程中,客户端服务器需要分别创建一个Socket对象,然后通过Socket对象建立连接客户端通过Socket对象向服务器发送数据,服务器通过Socket对象接收数据,并且可以向客户端发送数据。 Socket编程需要掌握网络编程的基础知识,包括IP地址、端口号、协议等。同时,还需要了解Socket编程的相关API,如socket()、bind()、listen()、accept()、connect()、send()、recv()等函数。 Socket编程可以应用于各种网络应用程序,如Web服务器、邮件服务器、聊天程序等。它是网络编程中的重要技术之一,对于网络程序员来说,掌握Socket编程是必不可少的。 ### 回答2: Socket编程是一种在计算机网络中实现程间通信的常用方式,可以用来实现客户端服务器之间的通信实现Socket通信的核心在于建立连接,通过连接实现数据的发送和接收。下面,我们将从以下几个方面来说明Socket编程实现客户端服务器通信的过程: 一、建立连接 客户端服务器之间的连接可以采用TCP或UDP协议来建立。当采用TCP协议时,需要先建立三次握手,确保连接的可靠性,这会消耗一定的时间。而采用UDP协议则不需要建立连接,可以直接发送数据包,但是由于UDP协议不具备可靠性,可能会导致数据丢失或失序。 二、数据发送 在建立连接之后,客户端服务器之间可以行数据的发送和接收。客户端在发送数据时,需要先创建一个套接字,调用send()函数发送数据。服务器端在接收数据时,则需要先创建一个套接字,调用recv()函数接收数据。在数据发送时,可以选择发送数据的大小,也可以选择分包发送。 三、数据接收 当客户端发送数据之后,服务器端会接收到数据。服务器端需要先创建一个套接字,然后监听并接收客户端发送的数据。在接收数据时,服务器端也可以选择一次性接收全部数据,也可以选择分批次接收数据。 通过以上步骤,就可以实现客户端服务器之间的通信。在实际应用中,还需要考虑多线程和多程的应用,以提高系统的并发性能。同时,还需要加入安全措施,防止黑客攻击。总之,Socket编程是网络编程的基础,掌握Socket编程的方法和技巧,可以更好地实现客户端服务器之间的通信。 ### 回答3: Socket编程是一种基于网络通信的编程技术,其主要目的是实现客户端服务器之间的通信。在Socket编程中,客户端服务器之间通过Socket通信协议建立连接行数据传输和通信Socket编程实现客户端服务器通信的过程,通常包括以下几个步骤: 1. 创建Socket对象:客户端服务器都需要创建Socket对象来通信客户端使用Socket对象来连接服务器服务器使用Socket对象来监听客户端请求并返回数据。 2. 连接服务器客户端通过Socket对象连接服务器,可以指定服务器的IP地址和端口号。服务器通过监听客户端请求,接收客户端请求信息。 3. 发送消息:客户端创建输出流,向服务器发送消息。服务器通过读取客户端发送的消息,处理请求,并返回响应数据。 4. 接收消息:服务器创建输入流,读取客户端发送的数据并处理请求。服务器通过输出流向客户端返回响应数据。 5. 关闭Socket连接:当通信结束时,客户端服务器均需关闭Socket连接Socket编程实现方式多种多样,可以使用不同的编程语言和工具行开发。例如,Java语言可以使用Java Socket API实现Socket编程,C++可以使用Winsock或Socket类库实现Socket编程,Python可以使用socket模块实现Socket编程等。 在实际应用中,Socket编程广泛应用于各种网络应用场景,如Web服务器、FTP服务器、邮件服务器等。通过Socket编程,可以实现高效、可靠的网络通信,为各种应用提供了强有力的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值