URL网络编程,最大的特征就是一对一的响应!

1:客户端“写”,服务器端用于“读”

 package coreBookSocket2;

 import java.io.InputStreamReader;
import java.io.Reader;
import java.net.ServerSocket;
import java.net.Socket; /*
* 这边为服务器端的读取
*/ /*
* 1:首先建立一个ServerSocket监听在端口8888上面,服务器端只需要定义和客户端相同的端口号即可
* 2:服务器端尝试接受来自客户端的请求
* 3:和客户端连接好了之后,就可以读取来自客户端的输入信息
* 4:定义一个StringBuilder对象用来保存来自客户端的信息
* 5:关闭Reader,client,server等占用资源的对象
*/
public class clientWtiteserverOpen { public static void main(String[] args) throws Exception{
ServerSocket server=new ServerSocket(8888);
Socket client =server.accept();
Reader reader=new InputStreamReader(client.getInputStream()); //客户端获取自己的输入流
char[] ch=new char[64];
int len;
StringBuilder sb=new StringBuilder();
while( ( len=reader.read(ch) )!=-1)
{
sb.append(ch, 0, len);
}
System.out.println("From Client:"+sb);
reader.close();
client.close();
server.close();
}
}
 package coreBookSocket2;

 import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 这边为客户端的写出
*/ /*
* 1:首先建立一个客户端的监听端口和IP地址,用相同的端口号与服务器端建立连接
* 2:从客户端向服务器端写出数据
*/
public class clientWriteserverOpen2 {
public static void main(String[] args) throws UnknownHostException, IOException { Socket client=new Socket("127.0.0.1", 8888);
Writer writer=new OutputStreamWriter(client.getOutputStream());
writer.write("Hello server");
writer.flush();
writer.close();
client.close(); } }

2:客户端先写后读,服务器端先读后写

服务器端:

 package ClientAndServerWriteBoth;

 import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket; /*
* 服务器端的编写
* 服务器端是先读后写,那么客户端必定是先写后读
*/ public class server {
public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(6666);
Socket client=server.accept(); Reader reader=new InputStreamReader(client.getInputStream());
char[] ch=new char[20];
int len;
StringBuilder sb=new StringBuilder();
String temp;
int index; while(( len=reader.read(ch)) !=-1)
{
temp=new String(ch, 0, len);
if( (index = temp.indexOf("eof")) != -1)//遇到eof时就结束接收, 这个地方没有怎么看明白?为什么到eof就结束?
{
sb.append(temp.substring(0, index));
break;
}
sb.append(temp);
}
System.out.println("---From Client: "+sb); Writer writer=new OutputStreamWriter(client.getOutputStream());
writer.write("Hello Client I'm server! ");
writer.flush();
writer.close();
reader.close();
client.close();
server.close();
}
}

客户端:

 package ClientAndServerWriteBoth;

 import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException; /*
* 客户端的编写,客户端先写后读
* 1:客户端设定特定的端口号与服务器端连接
*/ public class client {
public static void main(String[] args) throws UnknownHostException, IOException { Socket client=new Socket("127.0.0.1", 6666);
Writer writer=new OutputStreamWriter(client.getOutputStream());
writer.write("Hello server, I'm your father,client! 哈哈哈哈哈");
writer.flush();
//写完了开始读 Reader reader=new InputStreamReader(client.getInputStream());
char[] ch=new char[20];
int len;
StringBuffer sb=new StringBuffer();
String temp;
int index; while( (len=reader.read(ch))!=-1)
{
temp=new String(ch, 0, len);
if(( index=temp.indexOf("eof"))!=-1)
{
sb.append(temp.substring(0, index));
break;
}
sb.append(new String(ch, 0, len));
}
System.out.println("---From Server: "+sb);
writer.close();
reader.close();
client.close();
}
}

3:一个服务器端,对应多个客户端的连接

一个服务器端和多个客户端连接最好的方式就是用线程,因为服务器端接受客户端的连接的accept()方法是阻塞式的。

服务器端:

 package oneServerForLotsClient;

 import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 这边主要是服务器的demo的编写
* 1:仍然是准备工作,让服务器端和客户端之间建立相同的端口号,实现连接。
* 2:----因为客户端那边是多个对象连接服务器端,因此需要一个死循环让服务器一直接受连接客户端的连接请求!!!
* 建立一个新的线程去处理客户端的请求
*3:服务器端首先是“读取” 客户端发送过来的信息
*/ public class Server
{
public static void main(String[] args) throws IOException
{ ServerSocket server=new ServerSocket(6868);
while(true)
{
Socket client=server.accept();
new Thread(new Task(client) ).start();
}
}
}
 package oneServerForLotsClient;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
/*
* 这个类主要是用来处理新的线程,实现Runnable接口
* 1:首先定一个构造方法,主要是为了初始化client对象
* 2:同时重写run()方法,这个方法主要开启新的方法用于 “ 读” 数据,和 “写” 数据的处理
*/ public class Task implements Runnable { private Socket client; public Task(Socket client)
{
this.client=client;
} @Override
public void run() {
try {
handlerSocket();
} catch (IOException e) {
e.printStackTrace();
}
} private void handlerSocket() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
StringBuilder sb = new StringBuilder();
String temp;
int index;
while ((temp=br.readLine()) != null) {
System.out.println(temp);
if ((index = temp.indexOf("eof")) != -1) {//遇到eof时就结束接收
sb.append(temp.substring(0, index));
break;
}
sb.append(temp);
}
System.out.println("from client: " + sb);
//读完后写一句
Writer writer = new OutputStreamWriter(client.getOutputStream());
writer.write("Hello Client.");
writer.write("eof\n");
writer.flush();
writer.close();
br.close();
client.close(); } }

客户端

 package oneServerForLotsClient;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException; public class Client {
public static void main(String[] args) throws UnknownHostException, IOException { Socket client=new Socket("127.0.0.1", 6868); Writer writer=new OutputStreamWriter(client.getOutputStream());
writer.write("Hello,Server. My name is client! ");
writer.write("eof\n");
writer.flush(); //写完了就开始读 BufferedReader reader=new BufferedReader(new InputStreamReader(client.getInputStream()));
StringBuffer buffer=new StringBuffer();
String temp;
int index;
while ((temp=reader.readLine()) != null) {
if ((index = temp.indexOf("eof")) != -1) {
buffer.append(temp.substring(0, index));
break;
}
buffer.append(temp);
}
System.out.println("from server: " + buffer);
writer.close();
reader.close();
client.close(); } }

Socket编程——客户端,服务器端的读写操作的更多相关文章

  1. socket 实现单一串口共享读写操作

    前提:物理串口连接到PC上,通过串口号被PC唯一识别. 此时,物理串口通过该串口号仅能被单一线程或进程实例并占用,其他线程或进程不能再通过该串口号与物理串口通信.这个暂称为串口独占性. 解决思路:核心 ...

  2. java socket编程 初级 服务器端和客户端 通信

    package server; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerS ...

  3. socket编程中服务器端常用函数 以及简单实现

    1 常用函数 1.1   socket() int socket(int family, int type, int protocol); socket()打开一个网络通讯端口,如果成功的话,返回一个 ...

  4. C#版 Winform界面 Socket编程 Server服务器端

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Python socket编程客户端与服务端通信

    [本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...

  6. python--DenyHttp项目(1)--socket编程:服务器端进阶版socketServer

    在网上看到了SocketServer模块,于是Server端简化: #coding:utf-8 import socketserver class MyTCPHandler(socketserver. ...

  7. socket编程中客户端常用函数

    1 常用函数 1.1   connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...

  8. Linux的SOCKET编程详解

    1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 U ...

  9. [转]Linux的SOCKET编程详解

    From : http://blog.csdn.net/hguisu/article/details/7445768 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在 ...

随机推荐

  1. Hadoop 裡的 fsck 指令

    Hadoop 裡的 fsck 指令,可檢查 HDFS 裡的檔案 (file),是否有 corrupt (毀損) 或資料遺失,並產生 HDFS 檔案系統的整體健康報告.報告內容,包括:Total blo ...

  2. 《Entity Framework 6 Recipes》中文翻译系列 (16) -----第三章 查询之左连接和在TPH中通过派生类排序

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-10应用左连接 问题 你想使用左外连接来合并两个实体的属性. 解决方案 假设你有 ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16  过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...

  4. 【Prince2是什么】PRINCE2认证之Prince2衡量绩效的六大要素

      之前一篇文章已经跟大家从体系上讲解了PRINCE2和PMP的差异,那接下来我们进行第二讲,PRINCE2中讲到的衡量绩效的要素是什么呢? 第一,成本:即项目必须是所能负担的起的 第二,时间:即项目 ...

  5. [Hadoop大数据]——Hive连接JOIN用例详解

    SQL里面通常都会用Join来连接两个表,做复杂的关联查询.比如用户表和订单表,能通过join得到某个用户购买的产品:或者某个产品被购买的人群.... Hive也支持这样的操作,而且由于Hive底层运 ...

  6. thinkPHP入门之二

    thinkphp提供了很多便利的方法,因为php要记的东西太多了,而thinkphp极大简化了这些,让编写过程更加快速. 为了预防那些了解它的人胡乱玩耍,thinkphp提供一个函数_empty 它是 ...

  7. js实现继承的方式总结

    js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...

  8. mysql导入导出sql文件

    window下 1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > dbname.sql2. ...

  9. Sql Server系列:数据库对象

    数据库对象是数据库的组成部分,数据表.视图.索引.存储过程以及触发器等都是数据库对象. 数据库的主要对象是数据表,数据表是一系列二维数组的集合,用于存储各种信息. 视图表面上看与表几乎一样,具有一组命 ...

  10. 一种C#生成符合Java规则的二进制文件方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.一个项目中的真实问题 实际项目中,本想通过C#制作小工具生成SHP ...