Java的TCP网络编程
服务端代码:
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网络编程的更多相关文章
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- Java - TCP网络编程
Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...
- Java之HTTP网络编程(一):TCP/SSL网页下载
目录 一.简介:HTTP程序设计 1.HTTP系统设计 2.HTTP客户端工作过程 3.HTTP服务端工作过程 二.基于TCP Socket的HTTP网页下载 三.基于SSL Socket的HTTPS ...
- Java学习之网络编程实例
转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一 ...
- 黑马程序员:Java基础总结----网络编程
黑马程序员:Java基础总结 网络编程 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...
- Java进阶之网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- 第84节:Java中的网络编程(中)
第84节:Java中的网络编程(中) 实现客户端和服务端的通信: 客户端需要的操作,创建socket,明确地址和端口,进行键盘录入,获取需要的数据,然后将录入的数据发送给服务端,为socket输出流, ...
- 第78节:Java中的网络编程(上)
第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...
- 第62节:探索Java中的网络编程技术
前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...
随机推荐
- asp.net web.config配置节说明
web.config 文件查找规则: (1)如果在当前页面所在目录下存在web.config文件,查看是否存在所要查找的结点名称,如果存在返回结果并停止查找. (2)如果当前页面所 ...
- Android学生管理系统
现在要做这么一个小的demo,可以添加.展示,并且在添加完了之后刷新列表内容. 要点: 在代码中给线性布局添加View 让控件滚动,放到ScrollView中 保存数据就是把数据保存到本地,然后恢复的 ...
- 【深入JVM】JVM工具之JMAP
一.工具介绍 假设把java\bin文件夹配置到环境变量.在cmd输入jmap会有例如以下提示: 翻译:打印出某个java进程(使用pid)内存内的,全部'对象'的情况(如:产生那些对象,及其数量). ...
- label 标签的用法,点label选中单选、复选框或文本框
<label>拥有的权限</label> <label class="checkbox" id="privilege_id" st ...
- jQuery Easy UI Draggable(拖动)组件
上文已经提到过了 jQuery EasyUI插件引用一般我们经常使用的有两种方式(排除easyload载入方式),所以本篇要总结的Draggable组件相同有两种方式载入: (1).使用class载入 ...
- MySQL的max()函数使用时遇到的小问题
通常我们获取某个表的某个字段最大值时可以使用max()函数. 使用场景举例: 获取某个表id的最大值:SQL: SELECT max(id) FROM table_name; SELECT max(` ...
- Jmeter + Ant + Jenkins 接口/性能测试,持续集成环境搭建
1. 安装Jmeter.jdk Jmeter 3.3版本 :<http://note.youdao.com/noteshare?id=5e3fd287db24d08386207a7de22d26 ...
- vue Element UI 导航高亮
1. activeIndex 为默认高亮值,根据改变activeIndex的值来改变高亮的值 当页面改变的时候获取当前的路由地址,截取第一个 / 后面的值,就是当前的高亮值了 为什么要截取呢? 因为点 ...
- csv文件的格式
csv, comma separated values csv是一种纯文本文件. csv文件由任意数目的记录构成,记录间以换行符分割,每条记录由字段构成,字段间以逗号作为分隔符. 如果字段中有逗号,那 ...
- Linux踢出已登录用户
1.使用w命令可以查看当前登录系统的所有用户 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 - 08:05 4:29 0.09s 0.09s - ...