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()方法,所以接收不到信息。

原文地址:https://www.cnblogs.com/liaoxiaolao/p/9593645.html

时间: 2024-10-15 16:06:45

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

Java - TCP网络编程

Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回用户的socket 利用多线程对用户socket进行IO操作 注意:对Scoket/File进行创建.关闭,都需要放try catch中,检测 IOException,所以将网络IO部分整体放入try catch中即可. 1. 字符串操作 输出:PrintWriter out=new PrintWr

JAVA学习之TCP网络编程,Socket使用

ServerSocket 此类实现服务器套接字. ServerSocket常用的构造方法有以下几个, ServerSocket() 创建非绑定服务器套接字. ServerSocket(int port) 创建绑定到特定端口的服务器套接字. ServerSocket(int port, int backlog) 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号. ServerSocket(int port, int backlog, InetAddress bindAddr

Java笔记二十四.TCP网络编程

 TCP网络编程 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 从上面一节内容可以知道,利用UDP通信的两个程序是平等的,无主次之分,两个程序代码可以完全一样.但利用TCP协议进行通信的两个应用程序,是有主从之分的,一个称为服务器程序,另外一个称为客户机程序.Java中提供了ServerSocket类用于创建服务器端的socket,Socket类用于创建客户端socket. 一.APIs简介 java.net.ServerSocket (1

Java学习之网络编程实例

转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码

黑马程序员————java中的网络编程

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- java中的网络编程 一.网络编程概述:基于互联网的编程 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换. 二.网络模型:OSI和TCP/IP 1.OSI(Open System Interconnection开放系统互连

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

前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层->第二层数据链路层->第三层网络层->第四层传输层->第五层会话层->第六层表示层->第七层应用层. 物理层是主要定义物理设备标准,数据链路层是主要讲从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装.这层的数据较帧. 网络层是将从下层接收到的数据进行IP地址的

Linux下TCP网络编程与基于Windows下C#socket编程间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clos

Linux下TCP网络编程与基于Windows下C#socket编程之间通信

一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使socket处于被动的监听模式,并为该  socket  建立一个输入 数据队列,将到达的服务器, 请求保存在此队列中,直到程序处理他们. Accept():让服务器接收客户的连接请求. Connect():客户端使用connect函数来配置 socket并与远端服务器建立一个 TCP 连接. Clo

戏说TCP网络编程

1.何为TCP? ?? ???既然说到TCP协议网络编程,那么首先来了解下什么是TCP协议.TCP协议的全称叫Transmission Control Protocol 传输控制协议,是一种面向连接的.可靠的.基于字节流的传输层通信协议.在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上.? ?? ???面向连接是什么呢?面向连接可以理解为指定对象,就好像平时打电话一样,你要打电话需要电话号码,也就是需要指定打电话的对象:可靠就简单了,就是在传输的过程中