java网络编程——socket实现简单的CS会话

还记得当年学计网课时用python实现一个简单的CS会话功能,这也是学习socket网络编程的第一步,现改用java重新实现,以此记录。

  • 客户端
import java.io.*;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {
    public static void main(String[] args)throws IOException {
        Socket socket=new Socket();
//超时时间
        socket.setSoTimeout(3000);
        socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(),2000),3000);

        System.out.println("已发起服务器连接");
        System.out.println("客户端信息:"+socket.getLocalSocketAddress()+"P:"+socket.getLocalPort());
        System.out.println("服务器信息:"+socket.getInetAddress()+"P:"+socket.getPort());

        try {
            todo(socket);
        }catch (Exception e){
            System.out.println("异常退出");
        }
    }
    private static void todo(Socket client)throws IOException{
        //构建键盘输入流
        InputStream in=System.in;
        BufferedReader input=new BufferedReader(new InputStreamReader(in));
        //得到socket输出流并转化为打印流
        OutputStream outputStream = client.getOutputStream();
        PrintStream socketPrintStream = new PrintStream(outputStream);
        //得到socket输入流并转化为BufferedReader
        InputStream inputStream = client.getInputStream();
        BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        Boolean flag = true;
        do {
            //键盘读取一行
            String str = input.readLine();
            //发送到服务器
            socketPrintStream.println(str);
            //从服务器读取一行
            String echo = socketBufferedReader.readLine();
            if("bye".equalsIgnoreCase(echo)){//equalsIgnoreCase是忽略大小写的比较
                flag = false;
            }else{
                System.out.println(echo);
            }
        }while(flag);
        //资源释放
        socketBufferedReader.close();
        socketPrintStream.close();
    }
}
  • 服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args)throws IOException{
        ServerSocket server = new ServerSocket(2000);

        System.out.println("服务器准备就绪");

        System.out.println("服务器信息:"+server.getLocalSocketAddress()+"P:"+server.getLocalPort());
        //等待客户端连接
        for (;;){
            Socket client = server.accept();//拿到客户端
            ClientHandle clientHandle = new ClientHandle(client);//客户端加入到一个异步线程
            clientHandle.start();//启动线程
        }

    }
    /**
    客户端消息处理
     */
    private static class ClientHandle extends Thread{
        private Socket socket;
        private Boolean flag = true;

        ClientHandle(Socket socket){
            this.socket=socket;
        }

        @Override
        public void run(){
            super.run();
            System.out.println("客户端连接:"+socket.getInetAddress()+"P:"+socket.getPort());

            try {

                //得到打印流,用于数据输出;服务器回送数据使用
                PrintStream socketOutput = new PrintStream(socket.getOutputStream());
                //得到输入流,用于接收数据
                BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                do{
                    //客户端拿到一条数据
                    String str = socketInput.readLine();
                    if("bye".equalsIgnoreCase(str)){
                        flag = false;
                        socketOutput.println("bye");
                    }else{
                        System.out.println(str);
                        socketOutput.println("回送:"+str.length());
                    }
                }while (flag);
            }catch (Exception e){
                System.out.println("异常断开");
            }finally {
                try {
                    socket.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            System.out.println("客户端已退出:"+socket.getInetAddress()+"P:"+socket.getPort());

        }
    }
}

原文地址:https://www.cnblogs.com/buptleida/p/12433531.html

时间: 2024-08-01 10:41:25

java网络编程——socket实现简单的CS会话的相关文章

java网络编程socket\server\TCP笔记(转)

java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅 1 TCP的开销 a  连接协商三次握手,c->syn->s,s->syn ack->c, c->ack->s b  关闭协商四次握手,c->fin->s, s->ack-c,s->fin->c,c->ack->s c  保持数据有序,响应确认等计算开销 d

java网络编程socket解析

转载:http://www.blogjava.net/landon/archive/2013/07/02/401137.html Java网络编程精解笔记2:Socket详解 Socket用法详解 在C/S通信模式中,client需要主动创建于server连接的Socket(套接字).服务器端收到了客户端的连接请求,也会创建与客户连接的Socket.Socket可看做是通信两端的收发器.server与client都通过Socket来收发数据. 1.构造Socket 1.Socket() 2.So

Java网络编程——Socket

网络是连接不同计算机的媒介,不同的计算机依靠网络来互相通信,即传递数据. Java中与网络编程相关的部分主要是Socket(套接字),它作为一种抽象的结构,实现了与通信相关的各类方法,构成一套完整的通信机制. 当然,Socket本身是独立于编程语言之上的概念,就像数据结构与算法一样,它并不属于Java,而是一种公认的通信的解决方案,大部分语言都实现了与socket相关的通信功能. 原理 Socket通过使用TCP(传输控制协议)提供了两台计算机之间的通信机制.具体的方式是:服务器处会首先创建Se

java 网络编程(Socket) TCP/UDP 总结案例

网络编程:关注的是底层的数据传输 网页编程:数据的展示 1.基本概念 一.网络:将不同的计算机连接在一起局域网 城域网 互联网 二.地址:Ip地址确定网络上的绝对的地址位置   房子的地址 三.端口号(相当于房门):区分计算机上的软件 相当于房门两个字节0~65535 共65536个 1. 同一个协议下,端口号不能重复,不同的协议下可以重复 2. 1024以下的端口不要使用 80-->http 21-->ftp 四.资源定位 URL 统一资源定位 URI:统一资源 五.数据的传输 1. 协议:

java网络编程Socket通信详解

Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket.像大家熟悉的QQ.MSN都使用了Socket相关的技术.下面就让我们一起揭开Socket的神秘面纱. Socket编程 一.网络基础知识(参考计算机网络)            关于计算机网络部分可以参考相关博客:           <TCP/IP协议栈及OSI参考模型详解> http://wangdy.blog.51cto.com/3845563/

Java网络编程Socket通信

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议     UDP (User Datagram Protocol 用户数据报协议)是OSI(Open System Interconnection开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务 TCP与UDP基本区别   1.基于连接与无连接   2.TCP要求系统资源较多,UDP较少:    3.UDP程序结构较

java 网络编程Socket编程

Server.java import java.io.*; import java.net.*; public class Server { public static void main(String args[]) { String [] answer ={"南非","进入世界杯了","哈哈...问题真逗!"}; ServerSocket serverForClient=null; Socket socketOnServer=null; Da

网络编程-socket实现简单套接字通信

Service import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#给予网络,机于TCP协议的通信 #端口0-65535 #0-1024给操作系统使用 phone.bind(('127.0.0.1',8080)) #开始监听,表最大挂起链接数 phone.listen(5) #等待链接 #res=phone.accept() #res是一个套接字对象和客户地址 conn,client_addr=phone.ac

Java网络编程基础(六)— 基于TCP的NIO简单聊天系统

在Java网络编程基础(四)中提到了基于Socket的TCP/IP简单聊天系统实现了一个多客户端之间护法消息的简单聊天系统.其服务端采用了多线程来处理多个客户端的消息发送,并转发给目的用户.但是由于它是基于Socket的,因此是阻塞的. 本节我们将通过SocketChannel和ServerSocketChannel来实现同样的功能. 1.客户端输入消息的格式 username:msg    username表示要发送的的用户名,msg为发送内容,以冒号分割 2.实现思路 实现思路与Java网络