实现Socket服务端和客户端即时通信

由于即时通讯同时要接受来及远程Socket实例的消息,和发送消息给远程Socket实例。因此要建立两个线程分别来持续接受远端发送来的消息,和持续监听本地的输入并将其发送远程客户端。

一、服务端代码

package com.net;
import java.net.*;
import java.io.*;

/**
 * Description:
 * 搭建一个服务端来与客户端进行即时通行
 * 
 * @author Lee
 * */
public class ServerDemo{

    /**
     * Description:
     * 实现一个服务端实例,获取远程客户端实例即时通行
     * 
     * */
    public static void getClient(){
        ServerSocket server = null;
        Socket client = null;

        try{
            //以指定的端口实现一个Socket服务端实例
            server = new ServerSocket(12000);

            while(true){
                //获取客户端实例
                client = server.accept();
                System.out.println("已连接上"+client.getInetAddress()+"客户端,"+client.getPort()+"端口");

                //启动持续接受远程客户端消息,即输入流
                new Accept("client",client).start();
                //启动持续监控控制台输入,将其传送远程客户端
                new Return("client",client).start();

            }

        }catch(IOException e){
            e.printStackTrace();
        }finally{
            //关闭资源
            try{
                server.close();
                client.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }

    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        getClient();
    }

}



二、客户端代码

package com.net;
import java.net.*;
import java.io.*;

/**
 * Description:
 * 实现一个客户端与远程服务端进行即时通行
 * 
 * @author Lee
 * */
public class ClientDemo {

    /**
     * Description:
     * 实现一个客户端与远程服务端进行即时通行
     * */
    public static void getServer(String ip,int port){
        Socket server = new Socket();

        try{
            //连接远程服务端
            server.connect(new InetSocketAddress(ip,port));
            System.out.println("已连接上"+server.getInetAddress()+"服务端,"+server.getPort()+"端口");

            //启动持续接受远程服务端的消息,即输入流
            new Accept("client",server).start();
            //启动持续监控控制台输入,将其传送远程服务端
            new Return("client",server).start();

        }catch(IOException e){
            e.printStackTrace();

        }
    }

    public static void main(String[] args) {
        //此处应该改写为服务端的IP地址
        getServer("192.168.20.15",12000);
    }

}



三、接受消息线程代码

package com.net;
import java.net.*;
import java.io.*;
import java.util.Scanner;

/**
 * Description:
 * 实现持续监控远程Socket的消息,即输入流,并将其输出在控制台上
 * 
 * */
public class Accept extends Thread{
    Socket socket ;

    /**
     * Description:
     * 默认构造器
     * */
    public Accept(){}

    /**
     * Description:
     * 通过初试化Socket,name变量来构造Accept实例
     * 
     * @param name 该远程Socket实例的名字
     * @param socket Socket实例
     * */
    public Accept(String name,Socket socket){
        this.setName(name);
        this.socket = socket;
    }

    @Override
    public void run(){
        Scanner input = null;

        try{
            //获取远程Socket实例的输入流
            input = new Scanner(socket.getInputStream());

            //将输入流的内容输出之控制台上
            while(input.hasNext()){
                System.out.println(this.getName()+":"+input.next());
            }

        }catch(IOException e){
            e.printStackTrace();
        }finally{
            //关闭资源
            input.close();
        }
    }

}



四、发送消息线程

package com.net;
import java.net.*;
import java.io.*;
import java.util.Scanner;

/**
 * Description:
 * 持续地监控控制台上的输入,并将其发送给远程Socket实例
 * 
 * @author Lee
 * */
public class Return extends Thread{
    Socket socket;

    /**
     * Description:
     * 默认构造器
     * */
    public Return(){}

    /**
     * Description:
     * 通过初试化Socket,name变量来构造Return实例
     * 
     * @param name 该远程Socket实例的名字
     * @param socket 远程Socket实例
     * */
    public Return(String name,Socket socket){
        this.setName(name);
        this.socket = socket;
    }

    @Override
    public void run(){
        PrintWriter output = null;
        Scanner keyboard = null;

        try{
            //获取远程Socket实例的输出流
            output = new PrintWriter(socket.getOutputStream());
            //获取控制台的输入
            keyboard = new Scanner(System.in);

            //监控控制台上的输入,将其输出给输出流
            while(keyboard.hasNext()){
                output.println(keyboard.nextLine());
                output.flush();
            }

        }catch(IOException e){
            e.printStackTrace();
        }finally{
            //关闭资源
            output.close();
        }
    }

}


我们可以用telnet连接一下服务端,连接成功!
这里写图片描述
也可以看到java控制台上,有关于客户端的IP地址和连接端口,可以试一下发送消息给远程客户端。
这里写图片描述
可以看到远程客户端已收到了消息
这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的.NET WebSocket服务端即时通信实例,供您参考: 1. 首先,创建一个空的ASP.NET Web应用程序。 2. 在项目中添加一个类文件,命名为WebSocketHandler.cs,并在其中添加以下代码: ```csharp using System; using System.Collections.Concurrent; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; namespace WebSocketServer { public class WebSocketHandler { private static ConcurrentDictionary<string, WebSocket> _sockets = new ConcurrentDictionary<string, WebSocket>(); public async Task Handle(WebSocket socket) { var socketId = Guid.NewGuid().ToString(); _sockets.TryAdd(socketId, socket); while (socket.State == WebSocketState.Open) { var buffer = new ArraySegment<byte>(new byte[4096]); WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None); if (result.MessageType == WebSocketMessageType.Text) { var message = System.Text.Encoding.UTF8.GetString(buffer.Array, buffer.Offset, result.Count); await SendMessageToAllAsync(message); } else if (result.MessageType == WebSocketMessageType.Close) { WebSocket removedSocket; _sockets.TryRemove(socketId, out removedSocket); await removedSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); } } } private static async Task SendMessageToAllAsync(string message) { foreach (var socket in _sockets) { if (socket.Value.State == WebSocketState.Open) { var buffer = new ArraySegment<byte>(System.Text.Encoding.UTF8.GetBytes(message)); await socket.Value.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } } } } } ``` 3. 在项目中添加一个WebSocketMiddleware.cs类文件,并在其中添加以下代码: ```csharp using System; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; namespace WebSocketServer { public class WebSocketMiddleware { private readonly RequestDelegate _next; private WebSocketHandler _webSocketHandler { get; set; } public WebSocketMiddleware(RequestDelegate next, WebSocketHandler webSocketHandler) { _next = next; _webSocketHandler = webSocketHandler; } public async Task InvokeAsync(HttpContext context) { if (!context.WebSockets.IsWebSocketRequest) { await _next(context); return; } var socket = await context.WebSockets.AcceptWebSocketAsync(); await _webSocketHandler.Handle(socket); } } } ``` 4. 在Startup.cs文件中添加以下代码: ```csharp using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; namespace WebSocketServer { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddWebSocketManager(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseWebSockets(); app.MapWebSocketManager("/ws", app.ApplicationServices.GetService<WebSocketHandler>()); app.Run(async (context) => { await context.Response.WriteAsync("Hello World!"); }); } } } ``` 5. 在项目中添加一个WebSocketExtensions.cs文件,并在其中添加以下代码: ```csharp using Microsoft.AspNetCore.Builder; namespace WebSocketServer { public static class WebSocketExtensions { public static IApplicationBuilder MapWebSocketManager(this IApplicationBuilder app, string path, WebSocketHandler handler) { return app.Map(path, (x) => x.UseMiddleware<WebSocketMiddleware>(handler)); } } } ``` 6. 在项目中添加一个WebSocketManagerExtensions.cs文件,并在其中添加以下代码: ```csharp using Microsoft.Extensions.DependencyInjection; namespace WebSocketServer { public static class WebSocketManagerExtensions { public static IServiceCollection AddWebSocketManager(this IServiceCollection services) { services.AddSingleton<WebSocketHandler>(); return services; } } } ``` 7. 运行应用程序,并使用WebSocket客户端连接到ws://localhost:5000/ws。您可以使用任何WebSocket客户端,如Chrome的WebSocket插件。 8. 您现在可以向服务器发送消息,并通过服务器将它们广播到所有连接的客户端。 希望这个例子能帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值