---------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------

1. TCP/IP

1.概述

要建立连接,可以传输大量数据  通过三次握手玩成连接是可靠协议   必须建立连接,效率低,例如:下载,打电话

步骤:Socket和ServerSocket

简介:建立客户端和服务器端

通过Socket中的IO流进行数据传输

关闭socket

同样,客户端和服务器端是两个独立的应用程序

2.传输

客户端(Socket)和服务器端(ServerSocket)

客户端:在该对象创建的时候,就指定了主机地址,因为要先TCP必须要建立好连接,进行传输,或者使用connet方法来制定端口

客户端对象里面封装了字节读取流和写入流。这样更方便发送和接受数据。不断是服务端还是客户端,只要是对其传输的数据进行访问,那么就在Socket对象中获取流。

步骤:

1.创建服务,指定连接的主机和端口

2.获得输出流 然后输出数据

3.关闭服务

服务端:

1建立服务端的服务,ServerSocket,绑定端口

2获取连接过来的客户端对象 ServerSocket的accept方法。

3客户端如果发过来数据,那么服务端要使用对应的客户端对象,然后客户端对象的读取流来读取发过来的数据,打印在控制台上

4关闭服务端。

3.单向发出和读取

模拟客户端向服务端发数据,服务端读取客户端发送的数据后,然后输出。

 import java.io.OutputStream;
import java.net.Socket;
/**
* 客户端
* 1.定义服务端服务,指定目的地址和端口号
* 2.获得写入流,然后发发送的数据,并且发出
* 3.关闭客户端
*
*/
public class CilentTcp {
public static void main(String[] args) throws Exception{
/*创建了客户端服务,并且指定目的主机和端口号*/
Socket client=new Socket("192.168.1.101",10005);
/*获取输出流,用来发送数据*/
OutputStream out=client.getOutputStream();
out.write("hello world".getBytes());
client.close();
} }
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
* 1.定义服务端,然后指定服务端口
* 2.使用accept()方法获得客户端对象,然后获取读取流
* 3.然后读取客户端发送的数据
*/
public class ServerTcp {
public static void main(String[] args) throws Exception {
/* 创建了服务端,并且指定端口号 */
ServerSocket server = new ServerSocket(10005);
Socket socket = server.accept();// 获得了发送端对象
InputStream in = socket.getInputStream();// 获得读取流,用来读取发送端发送过来的数据
byte[] buf = new byte[1024];
int r = in.read(buf);//读取
System.out.println(new String(buf, 0, r));
} } 结果:
hello world

必须要先启动服务端,然后运行客户端,否则会连接失败

2. 客户端和服务端互访

客户端:

步骤:

1.建立Socket服务,并且指定要连接的主机和端口。

2.获得Socket流中的输出流,将数据写到流中,通过网络发送给服务端

3.获取Socket流中的输入流,将服务端反馈回来的数据获取到,并且打印

4.关闭客户端资源

mportjava.io.InputStream;
importjava.io.OutputStream;
import java.net.Socket;
importjava.net.InetAddress;
/**
* 客戶端
*/
public class ClientTcp {
public static void main(String[]args) throws Exception {
/*获得客户端服务*/
Socketclient = new Socket("192.168.32.17", 25000);
/*
* 获得客户端流中的输出流,并且把数据写到流中,然后传给的服务端
*/
OutputStreamout = client.getOutputStream();
out.write("服务端,你在吗".getBytes());
/**
* 获得客户端总的输出流,然后或得服务端反馈回来的数据,并且打印
*/
InputStreamin=client.getInputStream();
byte [] buf=new byte[1024];
int len=in.read(buf);
System.out.println(newString(buf,0,len));
client.close();
} }

服务端:

步骤:

1.建立ServerSocket服务,并且指定端口号。

2.获得客户端服务对象,输出客户端的地址

3.获得客户端的输入流,读取客户端发送的数据,并且打印。

4.获得客户端的输出流,给客户端发送反馈信息。

5.关闭服务端服务和客户端服务。

import java.io.InputStream;
importjava.io.OutputStream;
importjava.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
*/
public class ServerTcp {
public static void main(String[]args) throws Exception {
/* 创建了服务端,并且指定端口号 */
ServerSocketserver = new ServerSocket(25000);
Socketsocket =server.accept();// 获得了发送端对象
System.out.println(socket.getLocalAddress()+"connectsuccess");
/**
* 或得客户端的输入流,读取客户端发送的数据,并且打印
*/
InputStreamin = socket.getInputStream();// 获得读取流,用来读取发送端发送过来的数据
byte[] buf = new byte[1024];
int r = in.read(buf);// 读取
System.out.println(new String(buf, 0,r));
/**
* 获得客户端的输出流,给客户端反馈信息
*/
OutputStream out=socket.getOutputStream();
out.write("客户端,我在呢?要干嘛啊!!".getBytes());
socket.close();
server.close();
}
}

accept()和read()方法都是阻塞方法。

对于双方都通信的话,那么循环读取的话,用到IO读取,那么必须注意换行符,和刷新缓冲区。通常都是读取一行的话,那么要注意是否有换行符,newLine().

3.  上传文件

在网络传输文件

客户端:

步骤:1.定义服务端,同样也要指定目标地址和端口号。

2.定义对文件相应的流,读取文件。

3.获取客户端的输出流,和文件的读取交替读取和写入。

4.获得客户端的输入流,获取服务端反馈的信息。

 package www.fuxi.wangluo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* 客户端
* @author yang
*/
public class TextClient {
public static void main(String[] args) throws Exception{
Socket socket=new Socket("192.168.1.101",25001);
/**
* 获得文件的读取流,然后循环的读取文件
*/
BufferedReader br=new BufferedReader(new FileReader("copy.txt"));
/**
* 获得服务端的输入流,用来把要复制的文件内容,输入到网络流中
*/
PrintWriter pr=newPrintWriter(socket.getOutputStream(),true);//true代表自动刷新 String line=null;
while((line=br.readLine())!=null){
pr.println(line);//println有自动刷新功能
}
socket.shutdownOutput();//关闭客户端的输出流,相当于结束标记 /**
* 获得文件的输出流,用来获得服务端反馈的信息
*/
BufferedReader brs=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str=null;
str=brs.readLine();
System.out.println(str); brs.close();
br.close();
socket.close();
} }

服务端:

步骤:1.定义服务端服务,然后指定端口号。

2.获得客户端对象,然后从中获取读取流。

3.定义新文件的写入流,这样把读取流中的内容写入到新文件中。

4.获得客户端的写入流,反馈给客户端信息。

package www.fuxi.wangluo;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
*/
public class TextServer {
public static void main(String[] args) throws Exception {
/**
* 定义服务端,然后获得客户端服务对象
*/
ServerSocket server = new ServerSocket(25001);
Socket socket=server.accept();
/**
* 获得客户端的读取流,这样读取文件内容
*/
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
/**
* 获得目标文件的写入流,用来写入文件内容
*/
PrintWriter pr=new PrintWriter(new FileWriter("newCopy.txt"),true);
String line=null;
while((line=br.readLine())!=null){
pr.println(line);
}
/**
* 获得客户端的写入流,这样把信息反馈给客户端
*/
PrintWriter prs=new PrintWriter(socket.getOutputStream());
prs.println("上传成功!");
pr.close();
prs.close();
br.close();
server.close();
} } 结果:上传成功

注意点:一定要定义结束标记,否则会不会停止上传,结束标记可以自定义,也可以使用Socket中自带的方法来结束。

---------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------

黑马程序员_<<TCP>>的更多相关文章

  1. 黑马程序员_<<String类>>

    --------------------ASP.Net+Android+IOS开发..Net培训.期待与您交流! -------------------- 1. String类 1.概述 String ...

  2. 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17

    黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目 ...

  3. 2016年8月17日 内省(1)18_黑马程序员_使用beanUtils操纵javabean

    8.内省(1):18_黑马程序员_使用beanUtils操纵javabean 1.导入两个包: 2.调用静态方法. 9.泛型 map.entrySet() :取出map集合的键值对组成一个set集合. ...

  4. 黑马程序员_高新技术之javaBean,注解,类加载器

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...

  5. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...

  6. 黑马程序员_ JAVA中的多线程

    ------- android培训.java培训.期待与您交流! ---------- 尽管线程对象的常用方法可以通过API文档来了解,但是有很多方法仅仅从API说明是无法详细了解的. 本来打算用一节 ...

  7. 黑马程序员_ Objective-c 面向对象笔记详解

    1)类,对象,方法 类 类名: 1) 类名的第一个字母必须是大写 2) 不能有下划线 3) 多个英文单词,用驼峰标识 类的声明和实现 类的声明 @interface 类名 : NSObject { @ ...

  8. 黑马程序员_ Objective-c 概述及面向对象与三大特性

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ (一).语法概述 1. oc介绍:(.m文件) 1> c语言的基础上,增加 ...

  9. 黑马程序员_ Objective-c 之block、protocol学习笔记

    一):block学习总结 block :用来保存一段代码. 1.block 特点:  1> Block封装了一段代码,可以在任何时候执行   2> Block可以作为函数或者函数的返回值, ...

  10. 黑马程序员——OC语言 类和对象

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)类 1)类的声明 代码编写 ①定义一个Car类,拥有2个属性:轮子数 ...

随机推荐

  1. iOS 9音频应用开发基础教程

    iOS 9音频应用开发基础教程(大学霸内部资料)   介绍:iOS 9音频应用开发基础教程(内部资料)是iOS 9音频应用开发专向教程.本书采用Swift 2.0语言开发基于iOS 9的音频应用.实现 ...

  2. Hibernate 基于外键的双向一对一关联映射

    之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...

  3. 又见Python<1>:使用Anaconda搭建Python开发环境(Windows7)

    1.为什么选择Anaconda? Anaconda解决了Python使用痛点. Python好用但是令人头疼的就是库管理与Python不同版本的问题,特别是Windows环境下. 2.什么是Anaco ...

  4. 51nod部分容斥题解

    51nod1434 区间LCM 跟容斥没有关系.首先可以确定的一个结论是:对于任意正整数,有1*2*...*n | (k+1)*(k+2)*...*(k+n).因为这就是$C_{n+k}^{k}$. ...

  5. [BZOJ 2821] 作诗

    Link: BZOJ 2821 传送门 Solution: 一道类似区间众数的经典分块 由于个数为偶数这样的条件不能支持快速合并 因此要先$O(n*sqrt(n))$预处理出$pre[i][j]$表示 ...

  6. BZOJ2754 [SCOI2012]喵星球上的点名 SA+莫队+树状数组

    题面 戳这里 题解 首先先把所有给出的姓名和询问全部接在一起,建出\(height\)数组. 某个串要包含整个询问串,其实就相当于某个串与询问串的\(lcp\)为询问串的长度. 而两个后缀\(Suff ...

  7. 【lct】bzoj2002 [Hnoi2010]Bounce 弹飞绵羊

    lct板子,此题主要有cut操作和link操作. #include<cstdio> #include<iostream> #include<cstring> #in ...

  8. Block修改变量容易被忽略的方法

    C语言里面的 静态变量 静态全局变量 全局变量 其中静态变量和普通变量的截取模式是一样的,只是因为他赋值不被丢弃,所以能修改成功 code: #import <Foundation/Founda ...

  9. python3-开发进阶Flask的基础

    一.概述 最大的特点:短小精悍.可拓展强的一个Web框架.注意点:上下文管理机制,依赖wsgi:werkzurg 模块 二.前奏学习werkzurg 先来回顾一个知识点:一个类加括号会执行__init ...

  10. [BZOJ1005](HNOI 2008)明明的烦恼

    Description 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 ...