服务端代码:

package socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket; /**
* 聊天室服务端
* @author 小明
*
*/
public class Server {
/**
* 运行在服务端的ServerSocket主要有两个作用:
* 1:向系统申请服务端口,客户端就是通过这个端口与服务端建立连接的。
* 2:监听服务端口,一旦客户端与服务端建立连接,就会
* 自动创建一个Socket,并通过该Socket与建立连接的
* 客户端进行交互。
*
*/
private ServerSocket server; public Server()
{
try{
/**
* 实例化ServerSocket的同时要指定向系统申请的服务端口。注意,该端口
* 不能与当前系统其它应用程序申请的端口号一致,
* 否则会抛出端口被占用的异常。
*/
System.out.println("正在启动服务端...");
server = new ServerSocket(8088);
System.out.println("服务端启动完毕!");
}catch(Exception e){ }
} public void start()
{
try {
System.out.println("等待客户端连接");
Socket socket = server.accept();
/**
* 准备接受客户端连接
*
* 这是一个阻塞方法。
*一旦调用accpet()方法,服务端阻塞在这里,等着客户端连接了。
*这时当我们启动客户端时,客户端实例化socket,通过IP找到应用程序。
*这时accpet()马上就会有反应。accpet()方法执行完就返回一个socket。
*通过这个socket就可以与刚建立连接的这个客户端进行通讯了。
*客户端创建一个socket,服务端通过accept()接收一个socket。
*这时候就可以进行沟通了。
* 需要处理异常。
*/
InputStream in = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
String message = br.readLine();
System.out.println("客户端说:" + message); System.out.println("一个客户端连接了");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } public static void main(String[] args) {
Server server = new Server();
server.start();
} }

需要先启动服务器端,客户端才启动。

服务端运行后,accept()方法hi引起程序的阻塞。

客户端代码:

package socket;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 聊天室客户端
* @author 小明
*
*/
public class Client {
/**
* 套接字
* 封装了TCP协议的通信细节,让我们可以简单地使用它完成TCP通讯
* Socket连接后提供了两条流,通过两条流的读写操作完成与远端计算机的数据连接
* 完成与远端计算机的数据交换。
*/
private Socket socket;
/**
* 用来初始化客户端
*/
public Client()
{
try {
/**
* 实例化Socket时需要传入两个参数:
* 1:服务端的IP地址
* 2:服务端的端口号
* 通过IP地址可以找到服务端所在的计算机
* 通过端口可以找到运行在服务端计算机上的
* 服务端应用程序
* 注意,实例化Socket的过程就是连接的过程,若
* 连接失败就会抛出异常。
*/
System.out.println("正在连接服务端...");
socket = new Socket("localhost", 8088);
System.out.println("与服务端建立连接!"); /**
* 有两个参数,一个是IP地址,一个是端口号
*/
/**
* 所有应用程序在使用网络的时候都要和操作系统申请一个网络端口
*
*/
/**
* 异常要我们自己进行处理,不要抛出
*/
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } /**
* 写程序时不要过度依赖main方法
* 客户端开始工作的方法
*/
public void start()
{
try{
//socket.getOutputStream();
PrintWriter pw = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())), true);
//pw.write("你好服务端");
//使用上面这条语句是错的,要使用具有自动行刷新的方法
//不要再下意识地写上面那条语句了
pw.println("你好服务端!");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client = new Client(); client.start(); }
}

建立第二个服务端时,发信息给服务端时没有反应。

因为只调用了一次accept()方法,所以接收不到信息。

Java的TCP网络编程的更多相关文章

  1. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  2. Java - TCP网络编程

    Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...

  3. Java之HTTP网络编程(一):TCP/SSL网页下载

    目录 一.简介:HTTP程序设计 1.HTTP系统设计 2.HTTP客户端工作过程 3.HTTP服务端工作过程 二.基于TCP Socket的HTTP网页下载 三.基于SSL Socket的HTTPS ...

  4. Java学习之网络编程实例

    转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一 ...

  5. 黑马程序员:Java基础总结----网络编程

    黑马程序员:Java基础总结 网络编程   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...

  6. Java进阶之网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  7. 第84节:Java中的网络编程(中)

    第84节:Java中的网络编程(中) 实现客户端和服务端的通信: 客户端需要的操作,创建socket,明确地址和端口,进行键盘录入,获取需要的数据,然后将录入的数据发送给服务端,为socket输出流, ...

  8. 第78节:Java中的网络编程(上)

    第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...

  9. 第62节:探索Java中的网络编程技术

    前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...

随机推荐

  1. Unity3D占用内存太大怎么解决呢?

    最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个 ...

  2. hibernate双向一对多映射

    双向多对一 :Customer类------------>一的一端   Order类----------->多的一端 Customer类:(省略set().get()和构造方法) priv ...

  3. TP 自动验证

    #自动验证 一般验证 #自动验证 protected $_validate=array( #函数验证 array('role_name','require','角色名称不能为空!'), array(' ...

  4. CLR内存回收总结,代龄机制

    关键字:对象可达图,代龄机制,终止化对象. 代龄机制: 0代满了之后,GC开始回收,剩下的对象升级为1代.(只有不可达的对象才会被回收.) 0代再回收几次之后,1代的对象慢慢增多然后达到阈值,GC同时 ...

  5. web开发之html5---html5 动画特效舞动的雨伞

    http://www.cnblogs.com/stoneniqiu/p/4199294.html

  6. Linq系列(7)——表达式树之ExpressionVisitor

    大家好,由于今天项目升级,大家都在获最新代码,所以我又有时间在这里写点东西,跟大家分享. 在上一篇的文章中我介绍了一个dll,使大家在debug的时候可以可视化的看到ExpressionTree的Bo ...

  7. 同样的代码在java和c++中结果不同

    #include <iostream> using namespace std; /* run this program using the console pauser or add y ...

  8. hihoCoder #1388 : Periodic Signal

    NTT (long long 版) #include <algorithm> #include <cstring> #include <string.h> #inc ...

  9. 圆环自带动画进度条ColorfulRingProgressView

    这是项目中遇到了,我也是借鉴大神的, 下载地址:https://github.com/oooohuhu/ColorfulRingProgressView 我把它导入了github中了,里面有详细的使用 ...

  10. PHP手机号码正则表达式

    php用正则表达式判断手机号码的写法:从文章中匹配出所有的手机号就可以preg_match_all(),如果要检查用户输入的手机号是否正确可这样来检查:preg_match(). 用正则匹配手机号码的 ...