码迷,mamicode.com
首页 > Web开发 > 详细

<html>

时间:2017-08-16 13:13:12      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:common   play   项目管理   return   scripts   disable   new t   接收   推荐   


近期几天复习了下java网络编程socket使用我认为尽管以下的内容非常基础可是假设想要做出个好的东西想要高速掌握以后要学习的先要把基础打牢

假设基础打得好那么将来学习新的知识会非常快。事实上都是同理的。

假设大神能发挥下,拓展下完好下功能那就更好了,请在以下留下您的想法我会一直维护我的这些文章。

TCP 协议基础

IP协议是Internet的使用的一个关键协议,全称是Internet Protocol。即Internet协议通常简称IP协议通过IP协议,从而使Internet成为一个同意连接不同类型计算机的不同操作系统的网络。假设想要两台计算机通信那么就要使用同样的语言 那么就是用IP协议可是仅仅保证计算机能发送接受分组数据,IP协议负责将消息从一个主机发送到还有一个主机。消息在传送过程中被切割成包。

可是这样仅仅是攻克了他们之间的发送和接收数据可是还不能解决数据分组在传输数据过程中出现的问题。所以就须要使用TCP协议以保证提供可靠而且无差错的通信服务。

TCP协议是面向连接的端对端的协议。这是由于他对两台计算机之间的链接起到了关键的数据建立的链接用于发送和接收数据的虚拟链路

TCP和IP协议的功能尽管不尽同样,也能够分开使用。可是他们是在同一时期作为一个协议来设计的。而且在功能上也是互补的。

仅仅有两者结合起来才干保证internet在复杂的环境下正常的执行凡事要连接到internet的计算机都必须同一时候安装和使用这两个协议因此唱吧这两个协议叫做TCP/IP协议

使用serverSocket创建TCP服务器端

在两个通信实体之间没有建立虚拟链路之前必须先有一个通信实体先做出“主动姿态”主动地接受来自其它实体的连接请求。Java中接收其它的通信实体连接请求的类是ServerSocket,serverSocket用于监听来自socket端的连接,假设没有连接,他将一直处于等待状态。serverSocket包括一个监听来自client请求的方法

Socket accept():假设接收到一个client的Socket的链接的请求,该方法返回一个与client相应的socket否则该方法一直处于等待状态线程也被堵塞

为了创建serversocket对像,提供了例如以下几个构造器

serverSocket(int port)指定的port创建一个serverSocket对像该port应该有一个有效的port整数

serverSocket(int port,int backlog):添加一个用来改变连接队列长度的參数backlog

当serverSocket使用完成后,应使用serverSocket的close()方法关闭该serverSocket。

在通常情况下

 

服务器不用改制接受一个client的请求,而应该不断地接受来自client的全部的请求,所以java程序一般会循环的不断的调用serverSocket的accept()方法

使用socket进行通信

client通常能够使用socket的构造器连接到指定的server。socket通常能够使用给定的两个构造器连接到对应的主机或者是对应的IP地址的server这样就能实现对话

--

增加多线程

前面的Server和Client仅仅是进行了简单的通信操作:server端接收到client的连接之后。server端向client输出了一个字符串,而客户但也仅仅是读取server端的字符串后就退出了。实际应用中的client可能依据须要和server端保持长时间通信。即server端须要不断的读取client数据,并向client写入数据。client也须要不断的读取server端的数据,并向server端写入数据。

在使用传统的BufferReader的readLine()方法读取数据时,在该方法成功返回之前,线程被堵塞。程序无法运行。考虑到这个因素,server端应该为每一个Socket启动一个线程。每一个线程负责与一个client进行通信

client读取server端数据的县城相同会被堵塞。所以系统应该单独启动一个线程。

该线程专门负责读取server端的数据。

如今考虑实现一个命令行的界面的C/S聊天室应用,server端应该包括多个线程,每一个Socket相应一个线程,该线程负责读取Socket相应输入流的数据。并将读取到的数据向每一个Socket输出流发送一次(将一个client的数据广播给其它client)须要在server端使用list保存全部的Socket

server端的实现:

<span style="font-size:18px;"><span style="font-size:18px;">package com.example.administrator.openinternet;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * Created by Administrator on 2015/7/23.
 * server端的程序
 */
public class javaSocket {
    public static List<Socket> socketList = Collections.synchronizedList(new ArrayList<Socket>());
    public static void main (String [] args) throws IOException {
        ServerSocket ss = new ServerSocket(30000);
        while(true)
        {
            Socket s = ss.accept();
            socketList.add(s);
            new Thread( new ServerThread(s)).start();
        }
    }
}
</span></span>

server端的线程类:

<span style="font-size:18px;"><span style="font-size:18px;">package com.example.administrator.openinternet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.SocketException;

/**
 * Created by Administrator on 2015/7/23.
 * server端的线程
 */
public class ServerThread implements Runnable {
    Socket s = null;
    BufferedReader br = null;
    public ServerThread(Socket s){
        this.s = s ;
        try {
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));//创建并读取流
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * Starts executing the active part of the class' code. This method is
     * called when a thread is started that has been created with a class which
     * implements {@code Runnable}.
     */
    @Override
    public void run()
    {
        try
        {
            String content = null;
            while ((content = readFromClient())!=null)
            {
                for(Socket s:javaSocket.socketList)
                {
                    PrintStream ps = new PrintStream(s.getOutputStream());
                }
            }

        }catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private String readFromClient() {
        try
        {
            return br.readLine();

        }catch (IOException e) {
            e.printStackTrace();
            javaSocket.socketList.remove(s);//移除socketList中的数据三
        }
        return null;
    }
}
</span></span>
client实现:

<span style="font-size:18px;">package com.example.administrator.openinternet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

/**
 * Created by Administrator on 2015/7/23.
 * 我的client的程序
 */
public class MyClient {
    public static void main(String [] args) throws IOException
    {
        Socket s = new Socket("127.0.0.1",30000);
        new Thread( new ClientThread(s)).start();
        PrintStream ps = new PrintStream(s.getOutputStream());
        String line = null;
        BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
        while ((line = br.readLine())!=null)
        {
            ps.println(line);
        }
    }
}
</span>

client线程:

<span style="font-size:18px;">package com.example.administrator.openinternet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 * Created by Administrator on 2015/7/23.
 * client的线程
 */
public class ClientThread implements Runnable {
    private  Socket s ;
    BufferedReader br = null;

    public ClientThread(Socket s) throws IOException {
        this.s = s ;
        br = new BufferedReader(new InputStreamReader(s.getInputStream()));

    }

    /**
     * Starts executing the active part of the class' code. This method is
     * called when a thread is started that has been created with a class which
     * implements {@code Runnable}.
     */
    @Override
    public void run()
    {
        try
        {
            String content = null;
            while ((content = br.readLine())!=null)
            {
                System.out.println(content);
            }
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
</span>

这就实现了简单的回话,事实上能够继续扩展比方实现client和server端的数据的传递过几天更新过来


版权声明:本文为博主原创文章。未经博主同意不得转载。 举报
  • 本文已收录于下面专栏:

相关文章推荐

Linux 命令行聊天工具 Finch

pidgin同出一门,支持多种协议,包含我们经常使用的 MSN, Gmail , QQ。还有其它。

??下载地址:http://www.pidgin.im/??在线使用手冊:http://developer...

  • 技术分享
  • gorey
  • 2009-08-23 16:59
  • 1077

怎样从命令行实时监控Nginx Webserver

一旦Nginx Webserver在生产环境下搭建并执行起来,你就希望可以实时监測其活动。

实际上。普通的网络监控软件都可以提供支持实时监控Nginx的功能,比方Nagios、Zabbix和Munin。 ...

一个web页面的訪问的过程

用户打开浏览器输入目标地址(比方http://www.sina.com) 1. 浏览器首先会查询本机的系统,获取主机名相应的IP地址。 2. 若本机查询不到相应的IP地址,则会发起DNS请求,获取...

ASP编写一个网页界面。页面中设置button。button可以调用外部命令行程序

懂ASP的请进!

!小弟毕业设计,须要在嵌入式Webserver(我移植的Goahead)上编写一个界面,实现可以调用自己编写的一个读取传感器数据的命令行程序,因为刚接触这个方面。不知道怎样实现,自己苦闷了好...

YARN 配置、启动命令、 WEB UI 页面

报错要首先去看日志文件的报错信息 hadoop-2.5.0/logs/查看详细的日志文件 查看以.log 结尾的文件 设置reduce 的获取数据的方式,yarn-site.xml yarn.nod...

HTML仿命令行界面

HTML部分 WeChat Manager $(document).ready(function(){ $(document).keyup(function(event){ if(...

网页Web上调用本地应用程序(.exe)

网页Web上调用本地应用程序(.exe)
  • 技术分享
  • byxdaz
  • 2017-02-15 23:28
  • 2657

Linux命令行訪问网页

CURL?---?命令行浏览器 这东西如今已经是苹果机上内置的命令行工具之中的一个了,可见其魅力之中的一个斑 1) 二话不说。先从这里開始吧。 curl?http://www.yahoo.co...

web页面搭建

hwi(hive web interface)是hive命令行接口的一个补充,主要功能包含: 1.shema browsing :获取table的信息,包含serde、columen name、co...

C 版本号聊天室 C/S架构——client程序

/***************************************************************************** MARK:client命令 ...
  • 微博
    微信
    QQ
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多仅仅同意输入30个字)

技术分享

<html>

标签:common   play   项目管理   return   scripts   disable   new t   接收   推荐   

原文地址:http://www.cnblogs.com/mfmdaoyou/p/7372747.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
分享档案
周排行
mamicode.com排行更多图片
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!