Java - TCP网络编程

Server

逻辑思路:

  1. 创建ServerSocket(port),然后服务器的socket就启动了
  2. 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回用户的socket
  3. 利用多线程对用户socket进行IO操作

注意:对Scoket/File进行创建、关闭,都需要放try catch中,检测 IOException,所以将网络IO部分整体放入try catch中即可。

1. 字符串操作

输出:PrintWriter out=new PrintWriter(sock.getOutputStream(), true);

读取:BufferedReader in=new BufferedReader(new InputStreamReader(sock.getInputStream()));

或者:Scanner input=new Scanner(sock.getInputStream());

2. 字节操作(一般用于传输文件,体积大,要求效率高,用BufferedInputStream/BufferedOutputStream)

输出:BufferedOutputStream out=new BufferedOutputStream(sock.getOutputStream());

输出:BufferedInputStream out=new BufferedInputStream(sock.getInputStream());

import java.io.*;
import java.net.*; public class TCP_Server { public static void main(String[] args){ int port=8888; try {
ServerSocket sock=new ServerSocket(port);
System.out.println("服务器启动,Port:"+sock.getLocalPort());
while(true){
Socket client=sock.accept(); //***注意,accept()是个阻塞函数,返回client socket***
System.out.println("监测到TCP连接来自:"+client.getRemoteSocketAddress());
new WorkThread(client).start(); //多线程
}
}
catch (IOException e) {
System.out.println("ERROR Found: "+e.getMessage());
}
//end try catch }
} class WorkThread extends Thread{ Socket sock;
public WorkThread(Socket sock){
this.sock=sock;
} public void run(){
try{
//此处用BufferedReader实现
BufferedReader in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
PrintWriter out=new PrintWriter(sock.getOutputStream(),true); String s=null;
while((s=in.readLine())!=null){ //断开会返回null
if(s.equals("end"))
break;
System.out.println("收到:"+s);
out.println("Server:"+s);
} /*注意,readLine()是个阻塞函数,放在while((s=readLine())!=null)中会堵塞程序,等待用户的数据。
*有两种方式中断循环
*1.用户端断开TCP程序,in.readLine()会返回null
*2.用户正常退出,用户端发送个[结束标记]给服务器,服务器根据标记,中断循环
*/
System.out.println("监测到TCP连接来自:"+sock.getRemoteSocketAddress()+"已断开。"); in.close();
out.close();
sock.close();
}
catch(IOException e){
System.out.println(e.getMessage());
}
} }

Client

逻辑思路:

  1. 创建Socket(IP, port),其参数为目标服务器的IP和port
  2. 然后就可以通过Socket进行IO操作了
import java.net.*;
import java.io.*;
import java.util.*; public class TCP_Client { public static void main(String[] args) { Scanner in=new Scanner(System.in); try{ int port=8888;
String ip="127.0.0.1"; Socket sock=new Socket(ip, port); //从socket中输出
PrintWriter out=new PrintWriter(sock.getOutputStream(),true);
//从socket中读取,此处用Scanner实现
Scanner input=new Scanner(sock.getInputStream()); while(true){
System.out.print("请输入消息:");
String s=in.nextLine();
if(s.equals("end")){
out.println(s);
break;
} out.println(s);
System.out.println("发送:"+s);
s=input.nextLine();
System.out.println("收到:"+s);
} in.close();
input.close();
out.close();
sock.close();
}
catch (IOException e){
System.out.println("ERROR Found: "+e.getMessage());
} } }

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

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

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

  2. 二十三、Java基础--------网络编程

    Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...

  3. JAVA的网络编程

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

  4. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  5. 【转】JAVA之网络编程

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

  6. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

  7. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  8. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  9. TCP网络编程

    TCP网络编程  与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /**     * @param args     * @th ...

随机推荐

  1. linux 下mysql无法启动 mysql.sock

    在公司装的一键安装的lnmp环境,启动mysql时候发现mysql.sock不存在, 然后我进行查找  最后在  /usr/local/mysql/bin/mysql_safe  重新启动下 然后启动 ...

  2. Python之UDP编程

    参考原文 廖雪峰Python教程 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口 ...

  3. 行内块+calc+margin 三列布局

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. Tensorflow学习笔记(1):tf.slice()函数使用

    tensorflow 当中的一个常用函数:Slice() def slice(input_, begin, size, name=None) 函数的功能是根据begin和size指定获取input的部 ...

  5. linux top-显示或管理执行中的程序

    推荐:更多linux 性能监测与优化 关注:linux命令大全 top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具.通过top命令所提供的互动式界面, ...

  6. buf.readUInt8()

    buf.readUInt8(offset[, noAssert]) offset {Number} 0 <= offset <= buf.length - 1 noAssert {Bool ...

  7. LINUX-YUM 软件包升级器 - (Fedora, RedHat及类似系统)

    yum install package_name 下载并安装一个rpm包 yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关 ...

  8. 运用循环求和( sum operation in python)

    1.for loop example 1: sum of 1+2+...+10 ********** >>> sum=0 >>> for x in [1,2,3,4 ...

  9. 一些非常有用的工具类之javamail(from韩顺平)

    之前编写一个类淘宝服务器时,需要使用javamail发送邮件,搜到的一个工具类,很有用. 需要下载导入:activation.jar和mail.jar package com.cx.service; ...

  10. [bzoj1821][JSOI2010]部落划分(贪心)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1821 分析:题目看起来很吊,但只要贪心就行了,每次取相邻最近的两个点所在的集合合并知道 ...