网络编程(学习整理)---1--实现简单的控制台聊天室

1、简单的聊天室(控制台):

    功能实现:

      客户端和服务端的信息交流:

2、牵扯到的知识点:

   这个我大概说一下,详细后面见代码!

    

   1) 网络通讯的三要素
    1. IP
    2. 端口号。
    3. 协议

     2) InetAddress(IP类)

    常用的方法:
      getLocalHost(); 获取本机的IP地址
      getByName("IP或者主机名") 根据一个IP地址的字符串形式或者是一个主机名生成一个IP地址对象。 (用于获取别人的IP地址对象)

      getHostAddress() 返回一个IP地址的字符串表示形式。
      getHostName() 返回计算机的主机名

  

     3) 端口号是没有类描述的。
      端口号的范围: 0~65535
      从0到1023,系统紧密绑定于一些服务。
      1024~65535 我们可以使用....

     4) 网络通讯的协议:
      udp通讯协议

      tcp通讯协议。

   5)TCP
      (1)TCP通讯协议特点:
         1. tcp是基于IO流进行数据 的传输 的,面向连接。
        2. tcp进行数据传输的时候是没有大小限制的。
        3. tcp是面向连接,通过三次握手的机制保证数据的完整性。 可靠协议。
        4. tcp是面向连接的,所以速度慢。
        5. tcp是区分客户端与服务端 的。
        比如: 打电话、 QQ\feiQ的文件传输、 迅雷下载....

      (2) tcp协议下的Socket:
        Socket(客户端) , tcp的客户端一旦启动马上要与服务端进行连接。
        ServerSocket(服务端类)

      (3) tcp的客户端使用步骤:
        1. 建立tcp的客户端服务。
        2. 获取到对应的流对象。
        3. 写出或读取数据
        4. 关闭资源。

3、下面直接贴上我测试的代码:

  客户端代码:  

 1 package cn.chating;
 2
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.IOException;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStreamWriter;
 8 import java.net.Socket;
 9 import java.net.UnknownHostException;
10
11 /**
12  * 聊天:客户端
13  * @author 小风微灵
14  *
15  */
16 public class ChatClient {
17
18
19     public static void main(String[] args) throws Exception {
20
21         //建立客户端
22         Socket client=new Socket("192.168.9.122",22222);
23         /***********************************io start **************************************/
24         //得到输入的字符流对象
25         BufferedReader reader=new BufferedReader(new InputStreamReader(client.getInputStream()));
26
27         //得到输出的字符流对象
28         BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
29
30         //得到键盘输入流
31         BufferedReader keywrite=new BufferedReader(new InputStreamReader(System.in));
32
33         String content=null;
34
35         String get=null;
36
37         System.err.println("请输入要发送的信息:");
38
39         while((content=keywrite.readLine())!=null){    //向服务端发送信息
40
41             writer.write("客户端说:"+content);
42             writer.newLine();    //换行
43             writer.flush();        //发送
44
45             //接收服务端的信息
46             if((get = reader.readLine())!=null){
47                 System.out.println("服务端说:"+get);
48             }
49         }
50         /***********************************io end **************************************/
51         //关闭资源
52         client.close();
53     }
54
55 }

  服务端代码:

 1 package cn.chating;
 2
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.InputStream;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStreamWriter;
 8 import java.net.ServerSocket;
 9 import java.net.Socket;
10
11 /**
12  * 聊天:
13  *     一问一答的服务端
14  * @author 小风微灵
15  *
16  */
17 public class ChatServer {
18
19 public static void main(String[] args) throws Exception{
20
21         //建立socket服务端
22         ServerSocket server = new ServerSocket(22222);
23
24         //阻塞型的方法, 等待接收客户端的 连接
25         Socket rsocket =server.accept();
26
27 /***********************************io start **************************************/
28         //读取已连接的客户端发送的信息   输入字节流
29         InputStream is = rsocket.getInputStream();
30
31         //得到输入的缓冲字符流对象
32         BufferedReader reader = new BufferedReader(new InputStreamReader(is));
33
34         //得到输出的字符流对象
35         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(rsocket.getOutputStream()));
36
37         //得到键盘的输入流
38         BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
39
40         String content = null;
41
42         String send = null;
43
44         while((content = reader.readLine()) != null){
45
46             System.out.println("服务端接收到:"+content);
47
48             //键盘挂起,  一次
49             if((send = keyReader.readLine()) != null){
50                 writer.write(send);
51                 writer.newLine();//换行
52                 writer.flush();//发送
53             }
54         }
55 /***********************************io end **************************************/
56
57         //关闭资源
58         rsocket.close();
59     }
60
61 }
时间: 2024-10-03 18:38:36

网络编程(学习整理)---1--实现简单的控制台聊天室的相关文章

网络编程(学习整理)---2--(Udp)实现简单的控制台聊天室

1.UDP协议: 总结一下,今天学习的一点知识点! UDP也是一种通信协议,常被用来与TCP协议作比较!我们知道,在发送数据包的时候使用TCP协议比UDP协议安全,那么到底安全在哪里呢?怎么理解呢! 下面我说一下我的简单理解! 由于TCP协议是一种面向连接的协议,有三次挥手通信确认机制,且数据包没有代销限制,TCP协议确保在通信双方都收到对方确认信息的前提下,才开始为通信的双方传输信息(数据包)! 这样数据包的传输可以得到安全保障!所以简单的理解为安全的!当然一旦,出现网络问题,或者一些其他意外

Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自己理解的东西. 1.首先是对Winsock的一点介绍:Winsock是一种标准的API(应用程序编程接口),主要用于网络中的数据通信,它允许两个应用程序在同一台机器上或通过网络相互通信.需要注意的是Winsock和协议无关,使用Winsock编程接口,应用程序可通过普通网络协议如:TCP/IP(网络

网络编程学习小结

几种网络编程方式: ISAPI.CGI.WinInet.Winsock 它们之间的差别: 1)  ISAPI主要是开发基于浏览器client与server端程序.效率比CGI方式高,并且也扩展了CGI没有的一些功能.(基于TCP/IP模型中的应用层) 2)  CGI主要是开发基于浏览器client与server端程序.(基于TCP/IP模型中的应用层) 3)  WinInet主要是开发client程序.(基于TCP/IP模型中的应用层) 4)  Winsock主要是基于socket来开发clie

linux网络编程学习笔记之六 -----I/O多路复用服务端

多进程和多线程的目的是在于最大限度地利用CPU资源,当某个进程不需要占用太多CPU资源,而是需要I/O资源时,可以采用I/O多路复用,基本思路是让内核把进程挂起,直到有I/O事件发生时,再把控制返回给程序.这种事件驱动模型的高效之处在于,省去了进程和线程上下文切换的开销.整个程序运行在单一的进程上下文中,所有的逻辑流共享整个进程的地址空间.缺点是,编码复杂,而且随着每个逻辑流并发粒度的减小,编码复杂度会继续上升. I/O多路复用典型应用场合(摘自UNP6.1) select的模型就是这样一个实现

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定

linux网络编程学习笔记之四 -----多线程并发服务端

相对于使用进程实现并发,用线程的实现更加轻量.每个线程都是独立的逻辑流.线程是CPU上独立调度运行的最小单位,而进程是资源分配的单位.当然这是在微内核的操作系统上说的,简言之这种操作系统的内核是只提供最基本的OS服务,更多参看点击打开链接 每个线程有它自己的线程上下文,包括一个唯一的线程ID(linux上实现为unsigned long),栈,栈指针,程序计数器.通用目的寄存器和条件码,还有自己的信号掩码和优先级.同一个进程里的线程共享这个进程的整个虚拟地址空间,包括可执行的程序文本.程序的全局

linux网络编程学习笔记之五 -----并发机制与线程池

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我只是举几个例子作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.可以在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理需要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也很简单,在主线程中定时,定时到期,

转 网络编程学习笔记一:Socket编程

网络编程学习笔记一:Socket编程 “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下:

AJAX学习整理二之简单实例

做了几个简单的实例,加载txt文本内容.加载xml文件内容,把xml文本内容转换成html表格显示.废话不多说,直接贴代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <head>     <title>通过ajax获取文本内容</title>     <meta charset="utf-8">     <scr