24小时热门版块排行榜     石溪大学接受考研调剂申请>

【调剂】北京石油化工学院2024年16个专业接受调剂
查看: 654  |  回复: 4
【悬赏金币】回答本帖问题,作者子木傑将赠送您 10 个金币

子木傑

新虫 (初入文坛)

[求助] socket通信已有1人参与

请问有谁有一个简版的java  socket通信程序吗?能用enter键发送消息,显示时间,选取文件这些基础功能,谢谢了

发自小木虫Android客户端
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

子木傑

新虫 (初入文坛)

请问有一个简版的java??socket通信程序吗?能用enter键发送消息,显示时间,选取文件这些基础功能,谢谢了

发自小木虫Android客户端
2楼2017-12-29 11:30:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

前壳档案

木虫 (小有名气)

【答案】应助回帖

package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
* 聊天室客户端
* @author adminitartor
*
*/
public class Client {
        /*
         * java.net.Socket
         * 封装了TCP通讯协议,使用它与远程计算机进行
         * 网络通讯。
         */
        private Socket socket;
        /**
         * 构造方法,用来初始化客户端
         * @throws IOException
         * @throws UnknownHostException
         */
        public Client() throws UnknownHostException, IOException{
                /*
                 * 实例化Socket是需要传入两个参数
                 * 1:服务端ip地址
                 * 2:服务端端口
                 * 通过IP地址可以找到网络上的服务端所在的计算机
                 * 通过端口可以连接到该计算机上的服务端应用程序
                 *
                 * 实例化Socket的过程就是建立连接的过程,所以若
                 * 连接服务端失败,这里会抛出异常。
                 */
                System.out.println("正在与服务端建立连接...";
                socket = new Socket("localhost",8088);
                System.out.println("与服务端连接成功!";
        }
        /**
         * 客户端的启动方法,从这里开始执行客户端逻辑
         */
        public void start(){
                try {
                        Scanner scanner = new Scanner(System.in);
                       
                        OutputStream out = socket.getOutputStream();
                       
                        OutputStreamWriter osw
                                = new OutputStreamWriter(out,"UTF-8";
                       
                        PrintWriter pw
                                = new PrintWriter(osw,true);
                       
                        //启动读取服务端发送过来消息的线程
                        ServerHandler handler
                                = new ServerHandler();
                        Thread t = new Thread(handler);
                        t.start();
                       
                       
                        String line = null;
                        System.out.println("开始聊天吧!";
                        //上次发送后的时间
                        long lasttime = System.currentTimeMillis();
                        while(true){
                                line = scanner.nextLine();
                                long curr = System.currentTimeMillis();
                                //本次发送时间与上次发送时间要间隔1秒以上
                                if(curr-lasttime>1000){
                                        pw.println(line);
                                        lasttime = curr;
                                }else{
                                        System.out.println("说话速度太快!";
                                }
                               
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
       
        public static void main(String[] args) {
                try {
                        Client client = new Client();
                        client.start();
                } catch (Exception e) {
                        e.printStackTrace();
                        System.out.println("客户端启动失败!";
                }
        }
       
        /**
         * 该线程用来循环接收服务端发送过来的消息并输出到
         * 客户端自己的控制台上
         * @author adminitartor
         *
         */
        private class ServerHandler implements Runnable{
                public void run(){
                        try {
                                InputStream in = socket.getInputStream();
                                InputStreamReader isr
                                        = new InputStreamReader(in,"UTF-8";
                                BufferedReader br
                                        = new BufferedReader(isr);
                               
                                String message = null;
                                while((message = br.readLine())!=null){
                                        System.out.println(message);
                                }
                                       
                               
                               
                        } catch (Exception e) {
                               
                        }
                }
        }
}
考虑的时候你又掉了墙上
3楼2018-01-12 10:44:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

前壳档案

木虫 (小有名气)

【答案】应助回帖

package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
* 聊天室服务端
* @author adminitartor
*
*/
public class Server {
        /*
         * java.net.ServerSocket
         * 运行在服务端的ServerSocket主要有两个作用
         * 1:申请服务端口
         * 2:监听服务端口,一旦一个客户端通过该端口建立
         *   连接,则创建一个Socket用于与该客户端通讯
         */
        private ServerSocket server;
        /*
         * 该集合用来存放所有客户端的输出流,用于将消息
         * 广播给所有客户端
         */
        private List<PrintWriter> allOut;
       
        public Server() throws IOException{
                /*
                 * 初始化ServerSocket的同时需要指定服务端口
                 * 该端口号不能与系统其他应用程序已申请的端口
                 * 号重复,否则会抛出异常。
                 */
                server = new ServerSocket(8088);
               
                allOut = new ArrayList<PrintWriter>();
        }
       
        public void start(){
                try {
                        /*
                         * ServerSocket提供方法:
                         * Socket accept()
                         * 该方法会监听ServerSocket申请的服务端口
                         * 。这是一个阻塞方法,直到一个客户端通过
                         * 该端口连接才会返回一个Socket。这个返回
                         * 的Socket是用于与连接的客户端进行通讯的。
                         *
                         */
                        while(true){
                                System.out.println("等待客户端连接...";
                                Socket socket = server.accept();
                                System.out.println("一个客户端连接了!";
                                /*
                                 * 启动一个线程与该客户端交互
                                 */
                                ClientHandler handler
                                        = new ClientHandler(socket);
                                Thread t = new Thread(handler);
                                t.start();
                        }
                       
                       
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
       
        /**
         * 将给定的消息广播给所有客户端
         * @param message
         */
        private void sendMessage(String message){
                synchronized (allOut) {
                        //转发给所有客户端
                        for(PrintWriter o : allOut){
                                o.println(message);
                        }
                }
        }
       
        public static void main(String[] args) {
                try {
                        Server server = new Server();
                        server.start();
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
        /**
         * 该线程用来完成与指定客户端交互的工作
         * @author adminitartor
         *
         */
        private class ClientHandler implements Runnable{
                /*
                 * 当前线程通过这个Socket与指定客户端交互
                 */
                private Socket socket;
                /*
                 * 远程计算机地址信息,这里是客户端的地址
                 */
                private String host;
               
                public ClientHandler(Socket socket){
                        this.socket = socket;
                        /*
                         * 通过Socket可以获取远端计算机地址信息
                         */
                        InetAddress address
                                = socket.getInetAddress();
                        /*
                         * 获取远端计算机IP地址的字符串格式
                         */
                        host = address.getHostAddress();
                }
               
                public void run(){
                        PrintWriter pw = null;
                        try {                       
                                /*
                                 * InputStream getInputStream()
                                 * Socket提供的该方法可以获取一个输入流,
                                 * 通过该流客户读取到远端计算机发送过来
                                 * 的数据。
                                 */
                                InputStream in = socket.getInputStream();
                                InputStreamReader isr
                                        = new InputStreamReader(in,"UTF-8";
                                BufferedReader br
                                        = new BufferedReader(isr);
                               
                                /*
                                 * 通过Socket获取输出流,用于将数据发送
                                 * 给客户端
                                 */
                                OutputStream out = socket.getOutputStream();
                                OutputStreamWriter osw
                                        = new OutputStreamWriter(out,"UTF-8";
                                pw = new PrintWriter(osw,true);
                               
                                /*
                                 * 将该客户端的输出流存入到共享集合中
                                 *
                                 * 由于多个线程都会调用该集合的add方法向其中
                                 * 添加输出流,所以为了保证线程安全,可以将
                                 * 该集合加锁。
                                 */
                                synchronized (allOut) {
                                        allOut.add(pw);
                                }
                               
                               
                               
                               
                                sendMessage(host+"上线了!,当前在线"+allOut.size()+"人";
                               
                                String message = null;
                                while((message = br.readLine())!=null){
//                                        System.out.println(host+"说:"+message);
                                        //回复给当前客户端
//                                        pw.println(host+"说:"+message);
                                       
                                        sendMessage(host+"说:"+message);
                                }
                               
                               
                        } catch (Exception e) {
                               
                        } finally{
                                //处理客户端断开连接以后的工作
                               
                                synchronized (allOut) {
                                        //将该客户端的输出流从共享集合中删除
                                        allOut.remove(pw);
                                }
                               
                               
                                sendMessage(host+"下线了!,当前在线"+allOut.size()+"人";
                               
                                if(socket != null){
                                        try {
                                                socket.close();
                                        } catch (IOException e) {
                                                e.printStackTrace();
                                        }
                                }
                        }
                }
        }
       
}
考虑的时候你又掉了墙上
4楼2018-01-12 10:45:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

前壳档案

木虫 (小有名气)

或许你可以在网上找到exe或者app
考虑的时候你又掉了墙上
5楼2018-01-12 10:46:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 子木傑 的主题更新
不应助 确定回帖应助 (注意:应助才可能被奖励,但不允许灌水,必须填写15个字符以上)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[教师之家] 国内科研环境差导致国内科研水平差的根源 +3 zju2000 2024-04-18 3/150 2024-04-19 21:46 by songwz
[论文投稿] 催稿后秒拒 +3 lizhengke06 2024-04-19 4/200 2024-04-19 21:02 by LIU_V
[教师之家] 美国教授开除中国研究生:我就不该录取你! +7 苏东坡二世 2024-04-15 7/350 2024-04-19 16:20 by feng6531
[基金申请] 特别资助审核状态 +7 pantray 2024-04-17 7/350 2024-04-19 13:51 by Breezy恋
[论文投稿] CCS Chemistry投稿求助 30+3 wfqtriumph 2024-04-17 4/200 2024-04-19 08:56 by Bletilla
[论文投稿] 国家重点研发计划论文可以发MDPI里的期刊吗 +4 lin_2018 2024-04-17 4/200 2024-04-19 08:46 by TsolmonZ
[高分子] 聚氨酯丙烯酸酯预聚体合成 +3 15692385990 2024-04-14 6/300 2024-04-18 19:43 by zhang1991
[论文投稿] The total environment格式 25+4 lyyyyds0 2024-04-13 9/450 2024-04-18 09:33 by 我为人人研
[考研] 本科211 277分求调剂 +3 0854通信工程 2024-04-18 4/200 2024-04-18 09:11 by 花花平头哥
[博后之家] 博后进站年龄可以超过35岁? +8 suesong0818 2024-04-14 8/400 2024-04-18 08:38 by charles-c
[无机/物化] H3PO2在130度附近分解为磷化氢(剧毒),怎样防护,求指点。 1(金币+5) +3 大力2010 2024-04-13 9/450 2024-04-17 21:55 by 大力2010
[考研] 工学322,英语六级求调剂 +3 domax 2024-04-17 10/500 2024-04-17 21:25 by 东方花园小万
[考研] 347求调剂 +3 寒辰ovo 2024-04-15 7/350 2024-04-16 19:05 by 寒辰ovo
[考研] 312求调剂 +3 Lauhalo 2024-04-15 3/150 2024-04-16 10:16 by 19862091
[考研] 食品工程考数学283还能有什么调剂选择 +7 宇宙无敌美少女 2024-04-12 8/400 2024-04-16 10:11 by cyclodextrin726
[考研] 296求调剂 +3 Cclocomotive 2024-04-16 4/200 2024-04-16 10:04 by 19862091
[考研] 材料专硕329调剂遗留难民 +9 Kaylawander 2024-04-13 9/450 2024-04-15 19:21 by mumin1990
[考研] 334求调剂 +4 学药救人 2024-04-14 4/200 2024-04-15 15:05 by hunanzang
[考研] 300求调剂 +5 @Xqy668800 2024-04-14 6/300 2024-04-14 23:03 by lincunhui
[考研] 334求调剂 +4 学药救人 2024-04-13 6/300 2024-04-13 20:27 by 献世的王
信息提示
请填处理意见