一篇介绍 Java Socket 编程的经典文章

事实上网络编程简单的理解就是两台计算机相互通讯数据而已。对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。 Java SDK提供一些相对简单的Api来完成这些工作,Socket就是其中之一。

  对于Java而言。这些Api存在与Java.net这个包里面。因此只要导入这个包就可以准备网络编程了。网络编程的基本模型就是客户机到服务器模型。简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系。然后完成数据的通讯就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。基于这个简单的模型,就可以进入网络编程。

  Java对这个模型的支持有很多种Api.而这里我只想介绍有关Socket的编程接口。对于Java而言已经简化了Socket的编程接口。首先我们来讨论有关提供固定位置的服务方是如何建立的。Java提供了ServerSocket来对其进行支持。事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你。

以下是引用片段:
  ServerSocket server=new ServerSocket(6789);

  这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。

  好了。我们有了固定位置。现在所需要的就是一根连接线了。该连接线由客户方首先提出要求。因此Java同样提供了一个Socket对象来对其进行支持。只要客户方创建一个Socket的实例对象进行支持就可以了。

以下是引用片段:
  Socket client=new Socket(InetAddress.getLocalHost(),5678);

  客户机必须知道有关服务器的IP地址。对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供。它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。

  好了,上面的方法基本可以建立一条连线让两台计算机相互交流了。可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的。因为底层的网络是继续数据的。除非远程调用,处理问题的核心在执行上。

  否则数据的交互还是依赖于IO操作的。所以你也必须导入Java.io这个包。Java的IO操作也不复杂。它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。

以下是引用片段:
  BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
  PrintWriter out=new PrintWriter(server.getOutputStream());

  上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作。而原始的字节流来源于Socket的两个方法,getInputStream()和getOutputStream()方,分别用来得到输入和输出。那么现在有了基本的模型和基本的操作工具,我们可以做一个简单的Socket例程了服务方:

以下是引用片段:
  import Java。io。*;
  import Java。net。*;
  public class MyServer
  {
  public static void main
  (String[] args) throws IOException
  {
  ServerSocket server=new
  ServerSocket(5678);
  Socket client=server.accept();
  BufferedReader
  in=new BufferedReader(new
  InputStreamReader
  (client.getInputStream()));
  PrintWriter out=new
  PrintWriter(client.getOutputStream());
  while(true)
  {
  String str=in.readLine();
  System.out.println(str);
  out.println("has receive...");
  out.flush();
  if(str.equals("end"))
  break;
  }
  client。close();
  }
  }

  这个程序的主要目的在于服务器不断接收客户机所写入的信息只到。客户机发送"End"字符串就退出程序。并且服务器也会做出"Receive"为回应。告知客户机已接收到消息。客户机代码:

以下是引用片段:
  import Java.net.*;
  import Java.io.*;
  public class Client{
  static Socket server;
  public static void
  main(String[] args)
  throws Exception
  {
  server=new Socket
  (InetAddress.getLocalHost(),5678);
  BufferedReader in=new BufferedReader(new
  InputStreamReader(server。getInputStream()));
  PrintWriter out=new
  PrintWriter(server.getOutputStream());
  BufferedReader wt=new BufferedReader(new
  InputStreamReader(System.in));
  while(true)
  {
  String str=wt.readLine();
  out.println(str);
  out.flush();
  if(str.equals("end"))
  {
  break;
  }
  System.out.println(in.readLine());
  }
  server.close();
  }
  }
  酷爱. 誮訫汏蘿蔔 玄火 SOSO用户 无可 。-Solσ、 传说中de王子 potti ╱ 桳桳~糖↘ 梦江南 錵oО殇/tp 信念㊣永恒 夜ㄨ凝 や義℡ 。如荼 啊滴耙 ヾ狮子蓙ㄨ ▄︻┻┳═一 1oo﹪啲眞伈 ジ 蛇 ポ 扼杀 м某籹孓`゛ 爺⑤⒐s.偀俊 坏壊ヤ孩孓气 じ☆ve*☆*董 NO。one ⒈] Wǒ諟鉨De誰 ご綠★城浪子 帥気壞尐爺 ヤ〣粉墨彬 灰尘粒/db ㄨ江ㄨ Badboy頖縌 〓張芸銘〓 ●вμ離 轨迹 じ爻璑ヤ斌ㄞ ;孖 尐o觜亂ロ勿 ~!咖马~→帅 ホ頭亽° 佬蔢,0觜/个] 小小天使 惊寂 ★饿狼传说★ ☆烈★焰☆ 轩の皓月/yl κō你de我 疾风 ◆◢心◆亂◢ Lucky 被沉沦绑定 1生有祢!! 牽掱。或魴掱 ぁ僾YOU℡ぁ wl ヅ`灬櫻┈ゞ` 99186464 Doraemon 灬ぺо期待ミ ω耶♀稣★→ `啖莣⒈苆ヤ /go堃棄фㄨ 饥饿的路途 草☆衣あ坊 __︴VIP/酷█ ㄣ紸蓅ヤ厷宔 ┡訫oЮ戀Сb の隨風追忆の 建娃 /tp 阳光王子 .Mua﹖戲﹎ (_今生今丗. K.E.Y ° 豬頭禸' 偽何伈侗 相遇的魔咒 夏兲Dê菋噵 ┌/╱.訫誶孓 ●.Мiss" ☆云淡风轻ツ 月半弯 [夲亾巳冇緀] 我被老婆闹 ˊ嫀夶菽.ˊ /ty 〆 ′Mua.〢﹎寶 /kuk陈浩南 -[莪]/可以, ‘炸炸’帝 风声边界 ︶ㄣz.明﹏o _Di調℡…﹖ 高楼望月 互联/moon ★风云★ 陳尐楓 团结    ‐ 疍/, LT7318 ★BeBe★ 懶蟲 殘風ぞ看花敗 ♂单眼皮男人 ┇嵿級侽孒┇ 丶o鲽橆の!﹌ 似水流年 SOSO用户 キセ 贝ギ C.Weltraum ︶ㄣΜ∪sΤ 磁 针 ⒎ 爺 ︻◣僋翫◢︻ 被遗忘的逻辑 。守望幸福の ゞ氣質發行… 用一生来呵护 〃Styla. ξ、wO、⒑ 海之阔 无情雨 云卷云舒︶ㄣ 爱/xin许 天使de宠儿 ╱淚划訫空 +往事随风/mg 瑟瑟男 紫晶少女 ☆许/aiq诺☆ /mn丫头 张浩疆 夨踪乆口, 小欢我能行 /aiq悲傷wǒ 《1⒊9》。 网络 .D`.﹎しベo M.ˊ蓜甪゛- 錑濕 ︻╋━━━━ 壞壞ぐ不學壞 £幻語☆寂° SOSO用户 僞裝の堅強 Unique 々爱ギ* _停芷伈跳 南京旅游 陌生人 爱琴海 Zzヤ愛上伱こ ′Mua.〢﹎波 雨兲仲啲貓兒 夕┓┗颜+? ︷Οo.沴悕 ♂冰情雪影♀ ●.|к侽紸角 ┃┫APP¥ bubishuo 无业游民 ╱/.__╋ ﹎ lemon 帝豪五金厂 玲玲^o^ lxdows →斷情戒愛^- TOヤ桀 无名 錯過!. 死亡赱吻シ NuméroUn/ty 掉线掉到崩溃 ˊ(-. J 万信网络 QQ堂 じ☆ve彬 风中密码 烟花 【帥弔煩騲】 |▍`謝幕.ノ ~cui~~cui~~~ /ka李晓东/cy ゞ 嘰咕╰* ╱7號呦唲圜 花开彼岸 ヽ看尒缠绵み 〆颺颠瘋 缤纷じ☆童年 ﹎.偶然 就是不同意 aGaiNsT`華 ♂星·願♀ ɑ.﹏纞ゞo瓊 ╰ 清汤① - Knapsack' ˋ._X.King ? 僾祗*儊軆魇 後來。。。。 の柒玥莳捌& 胡灵杰 寂寞流星 │5.軹z垀祢 消失d天堂 X那個[嗄兲 肥仔 ︶圍棋メヾ 痞痞 眼泪 绿色的稻草 ヤ綄媄嘚沍動 /aiq奇迹/aiq 花谢会再开 怺逺等待 绝不转让 丿珄暧伱!~ ●、ˊ漁児゛ -·莪啲芯蘾 ァ天亮說晚安 *_.阿里冲ヾ ?????? 【缘】`love` 一切OK {簡單僾x。 簡譂/xin嬡 *尛//]°.● 雙魚座★情 海纳百川 尛楊, 小乐 野狼 痕迹 ╳灬寶貝乖乖 补锑锅 尛嘚③蒶z⒈ 沙儿 _:バ//兲.後 醉春风 繏择袮.。o ぃ翳灬0o。 天天向上  毛毛虫 菲亦所丝/mg -=[S]=- XD紫江企业 灵魂№永恒 (龅_浩)?! 会游泳的鱼 '皓晗同學﹖ 地心引力 ﹢﹒Mo!m .借ぞ過ぺ *莼灰色.MikO SOSO用户 足球迷 爱与恨 〆;o蕶薍﹏伈 李成竹 12 ご殘サ戀じ溆 ┍路边小贩ぁ 丨ovE灬卩i丶 恋ざ没种说.. -[夶]豬頭 、 达亮 ●.莼潶Sè 『微雨尘埃』 ;纟吢煭肺ㄋ 儍苽℡暧妳 啖莣⒈苆ヤ_. Séνèn え张祎ぇ :Me.〢餠幹 偽僾ぴ絾淪 シ風残淩度∮ ︶ㄣ恋☆魂ㄣ 咗錌 蟲蟲℡ 寶兒~ε︶ ♂嗳^祢~/xin ·①丗乨ˇ緣 SOSO用户 Cancer飞 */╱ _、髒噯 浪涛无声 ~~为爱而狂 陌上/aiq花开 κiζsヤStǒ 眼泪·无罪 ·Rake, 小衛 漠漠輕寒 曾經愛過 { 夏末。 見鬼拉 ☆開鈊 √ 百变巨蟹 ツ№大头♀ 轻剪の飞扬 ∥君君∫£ ★風★ ゛訫`.兲眞メ | 嘴対嘴‖ /cy孤独一生 滴血£剑 ~明月≈清风~ .!?蒾纞┏ .. 基拉こ和 「-嘘.表吵﹏ SOSO用户 ヾ 楿﹏氺 ▓ 只為開訫/am ??Me_囡.孒 ╰*★.阿璡 eleven Robert show~ 12345678 ㄗs↘灬寵噯. 貝戈→Me ┍ 葬ご戀+● 無情 -Chou。 星辰钻石 镜花水月 _○n!y厷孓.. 网癌晚期/v 風.聲 ☆沉默づ ☆◎★↑← 平wo一颗真ベ 吴某. _&ㄗメ零亂Oo ▄▄▄▄▄▄ °┾慧寳 亲亲你亲亲我 靜風聽蒗/mg ㊣☆②⑻經嬡 ‘.隔夜﹏. 王じ☆ve子 全部甩翻 ★純中國種★ 落落飘霖 起风的清晨 ωǒ孓亥Zi愾 (_灬風ぺ絗憶 一片鱼鳞 秋宜 {轉過身}`` 陪你去看世界 嬸.啲愛* 謎│╃→阿桑 快楽づ寶呗 ﹎冷若寒冰 叨叨゛ ㊣゛儍仔﹌╃ ①鈊①薏選擇 木時 Vision乄豬豬 印度阿三 …X.’ /love /dao ^_^冭過忝塡~ 翼幻星仪 —≯七夜清风 埋沒41.2% 漫步岁月 ┍冰舞笨笨┍ ﹎夨惢侽孓_! oO芭比の公主 猫/cat 听兲甴掵 /tp尐壞疍 雪舞云霓灬 假rǘ铕①兲 亥Ta.[m ] ♂阳光*男孩~ 雪/xs痕 爱,直至成伤 电脑部 ゞ寵壞妳ヤo 偸芯賊/se ㄣ铕點亂グ ┾斷ヂē誸 ヤo﹎纁銥愺| *﹏繧寶寶℡ 第四颗流星 榊 棍 ﹎蜡笔尐噺﹎ ahsjadjajdj 朙朙很愛鉨 S&K〉, 春风喜雨桃花  風 俺老大是佛祖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你关于Java Socket网络编程的问题。 Java Socket网络编程Java语言中常用的网络通信技术之一,它可以实现客户端与服务端之间的通信,常用于开发网络应用程序、网络游戏等。下面我们来看一个基于Java Socket网络编程的应用实例。 假设我们有一个简单的聊天室应用程序,它由一个服务端和多个客户端组成。服务端负责接收客户端连接请求,并将客户端发送的消息广播给所有连接到服务端的客户端,客户端负责向服务端发送消息并接收来自服务端的消息。 1. 服务端实现 首先,我们需要编写服务端的代码。服务端需要监听指定的端口,等待客户端的连接请求,并在接收到连接请求时为每个客户端创建一个独立的线程进行处理。以下是服务端的代码示例: ```java import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; boolean listening = true; try { serverSocket = new ServerSocket(4444); } catch (IOException e) { System.err.println("Could not listen on port: 4444."); System.exit(-1); } while (listening) { new ServerThread(serverSocket.accept()).start(); } serverSocket.close(); } } class ServerThread extends Thread { private Socket socket = null; public ServerThread(Socket socket) { super("ServerThread"); this.socket = socket; } public void run() { try { PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { out.println(inputLine); } out.close(); in.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 2. 客户端实现 接下来,我们需要编写客户端的代码。客户端需要连接到服务端指定的端口,并在连接成功后启动一个单独的线程用于接收来自服务端的消息。以下是客户端的代码示例: ```java import java.io.*; import java.net.*; public class Client implements Runnable { private static Socket socket = null; public static void main(String[] args) throws IOException { String hostName = "localhost"; int portNumber = 4444; try { socket = new Socket(hostName, portNumber); } catch (UnknownHostException e) { System.err.println("Don't know about host " + hostName); System.exit(1); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to " + hostName); System.exit(1); } BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); new Thread(new Client()).start(); String userInput; while ((userInput = stdIn.readLine()) != null) { PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println(userInput); if (userInput.equals("exit")) { break; } } socket.close(); } public void run() { try { BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println("Server: " + inputLine); } in.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 以上就是一个简单的基于Java Socket网络编程的聊天室应用程序的实现。在实际开发中,我们可以根据具体需求对代码进行修改和优化,使其更符合实际业务需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值