• 締切済み

ソケット通信を使ってimageデータを送受信する

開発環境:VB2003 プログラム中で作成したimageデータを送受信したいのですが、 以下のコードでmyFileStreamに直接imageを代入して送信しようとすると 「指定されたキャストは有効ではありません」というエラーが出てしまいます。 myFileStream = image Dim buffer(4095) As Byte Dim nbytes As Integer nbytes = myFileStream.Read(buffer, 0, buffer.Length) Do While nbytes > 0 mySocketWriter.Write(buffer, 0, nbytes) nbytes = myFileStream.Read(buffer, 0, buffer.Length) Loop 送受信するにはimageデータを何らかの形式に変換する必要があるのでしょうか? どうかご教授お願い致します。

みんなの回答

  • toshi7607
  • ベストアンサー率12% (60/482)
回答No.1

よくわからないで回答するのも何ですが、 それってストリーミングプロトコルを使って転送しようとしているんですかね? ならストリーミング送信できる形式(動画)じゃないとダメなんじゃ? TCP/IPでデータ転送するのであれば、それなりの転送プロトコルに乗せてやる必要があります

caldea
質問者

お礼

toshi7607さんアドバイスありがとうございます。 ストリーミングプロトコルを使うというのはぜんぜん思いつきませんでした、 いろいろと調べて試したみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • java でソケット通信をするとき

    javaでソケット通信をするとき、 //データ受け取り byte[] buffer = new byte[2048]; try { int size = 0; while (size <= 0) { size = is.read(buffer); } receiveStr = new String(buffer, 0,size, "UTF8"); } catch (IOException e) { e.printStackTrace(); } のようにしていますが、これだと文字数にして一度におくれる容量はどのくらいでしょうか? また、それらを増やすにはどうしたらいいでしょうか?

    • ベストアンサー
    • Java
  • TcpClientとWebbrowser

    TcpClientでストリームからバイトでhttpデータを取得しましたが、 EUC-JPの文字コードのサイトだけがhtml内に本来入るはずのない数値が沢山現れます。 いっそのことWebBrowserコントロールを使ってサイトにアクセスし、DocumentTextを参照した方が手っ取り早いでしょうか? バイトから文字列の変換はわかりましたが、文字列から文字列へ文字コードを変換する方法がわからず困っています。ご存知の方教えていただけますか? 以下、EUC-JPの時に数値が混入するサンプルです。 '--------------------------------------------------------------------------------------------------- ' httpファイルを読み込む '--------------------------------------------------------------------------------------------------- Private Sub GetHttp(ByVal host As String, ByVal port As Integer, ByVal cmd As String, ByRef retcode As Integer, ByRef http_data As String) 'TCP/IP接続を行う Dim client As New TcpClient() Try client.Connect(host, port) 'ストリームを取得する Dim stream As NetworkStream = client.GetStream() Dim param As String = cmd + " HTTP/1.0" + ControlChars.CrLf+ControlChars.CrLf Dim buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(param) stream.Write(buffer, 0, buffer.Length) Dim sb As New System.Text.StringBuilder() Dim len As Integer http_data = "" Dim bytData() As Byte = New Byte(1048576) {} '1MB Dim strCharset As String = "" 'すべて受信する Dim cnt As Integer For cnt = 1 To 1000 '受信 len = stream.Read(bytData, 0, bytData.Length) 'バッファサイズを与えて、受信サイズを得る sb.Append(Encoding.GetEncoding("utf-8").GetString(bytData, 0, len)) 'utf-8 If Not stream.DataAvailable Then '受信キューにデータがある場合はTrue Exit For End If Next '正常に受信できた場合 http_data = sb.ToString retcode = 0 Catch ex As Exception retcode = -1 http_data = "" Finally client.Close() End Try End Sub '----- Dim host As String = "ホスト名" Dim port As Integer = 80 Dim cmd As String = "GET /index.html" '戻り値 Dim retcode As Integer Dim http_data As String = "" Dim charset As String = "" Try GetHttp(host, port, cmd, retcode, http_data) Catch ex As Exception MessageBox.Show(ex.Message, "エラーです。") End Try

  • バイナリの高速読み取り

    vb2005でバイナリデータを16進数で読み込みたいのですが、 Dim br As New System.IO.FileStream("フルパス",IO.FileMode.Open, IO.FileAccess.Read) Dim strbyte As String For I As Integer = 0 To CType(br.Length, Integer) - 1 strbyte = Hex(br.ReadByte).ToString If strbyte.Length = 1 Then strbyte = "0" & strbyte End If TextBox1.Text = TextBox1.Text & " " & strbyte Application.DoEvents() Next とか、他に Dim arByte() As Byte = My.Computer.FileSystem.ReadAllBytes("フルパス") Dim obyte As Byte Dim strbyte As String For Each obyte In arByte strbyte = Hex(obyte).ToString If strbyte.Length = 1 Then strbyte = "0" & strbyte End If TextBox1.Text = TextBox1.Text & " " & strbyte Application.DoEvents() Next なんかも試してみたのですが、ぜんぜん読み込みが遅くて困っています。 なんか高速にバイナリデータを16進数で読み込む方法がありましたら教えてください。(一般のバイナリエディタ並に)

  • vb.netでByte型の実配列サイズが大きい件

    vb.netでByte型の配列を100byteで宣言しましたが、実際の配列サイズは101byteになりました。 (例) Module Module1 Sub Main() Dim buffSize As Integer = 100 Dim inputBuff(buffSize) As Byte Dim ii As Integer = inputBuff.Length Console.WriteLine("バッファサイズ = {0}", ii) End Sub End Module ここで、iiは、101となります。 CとかC++では、有り得ない仕様ですが、どういう意味が有るのでしょうか? ご教示お願い致します。

  • VB2005 で NetworkStream で取得したデータのバイト数の取得方法について

    VB2005 の初心者です。 System.Net.Sockets を利用して、Windows端末のAシステムとLinux端末のBシステムの通信部分のサービスを開発しています。 その際、NetworkStream で受信したデータのバイト数を取得したいのですが、やり方が分かりません。 データを取得している部分のソースは下記です。 10000バイトずつ取得していますが、 最後、10000バイトに満たない場合、取得したデータのバイト数が知りたいです。 Dim LNetworkStream As NetworkStream Dim LbEndFlg  As Boolean Dim LucData(10000) As Byte Do While LbEndFlg LNetworkStream = objClient.GetStream() Redim LucData(10000) LsLen = LNetworkStream.Read(LucData, 0, LucData.Length)  LbEndFlg = FindEndOfClaim(LucData) LstrText = System.Text.Encoding.UTF8.GetString(LucData, 0, LsLen) MstrXML = MstrXML & LstrText Loop NetworkStream には、SetLength というメソッドがありますが、 これは必ず例外を発生させてしまうので、 例外を発生させずにバイト数を取得したいです。 何かヒントになることでも良いので、 皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。

  • VBAのByte配列からInteger値を取り出し

    Access VBA初心者です。 Dim Ax( 1 to 256 ) as Byte Dim Bx as Integer があるとします。 Ax(1)~Ax(256)には,データが入っています。 Ax(102)~Ax(103)を切り出して,Bxに代入したいのですが,どうしたら良いのでしょうか。 Bxの値は整数として,あとの処理に使います。

  • ソケットプログラミングについて

    こんにちは。 前回、質問しました「バード」という者です。 ソケットプログラミングについて質問します。 PC1から、jpegやmpegファイルを送信しPC2で受信するというプログラムをC言語で作ってみたいと思っています。 以前、少しだけJAVAプログラミングでPC1(送信側)からPC2(受信側)へデータを送信するプログラムを作ったのですが、作ったプログラムの概要を以下に示します。 [送信側] (ファイルオープン) InputStream in = new FileInputStream(ss); BufferedInputStream bin = new BufferedInputStream(in); ↓ (データを読みsendメソッドにて随時送信) while((c = bin.read(buffer, 0, buffer.length))!=-1){ dPacket = new DatagramPacket(buffer,buffer.length,iAddress,port); dSocket.send(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); [受信側] (ファイルオープン) OutputStream out = new FileOutputStream(args[1]); BufferedOutputStream bout = new BufferedOutputStream(out); ↓ (送信側から来たデータをreceiveメソッドにて受信) while(true){ dPacket = new DatagramPacket(buffer,buffer.length); dSocket.receive(dPacket); } ↓ (ファイルとソケットクローズ) dSocket.close(); 上記に示す様に、ファイルをオープンし、DatagramSocketとDatagramPacketクラスを用いて送受信し最後に、ファイルをクローズするという形式をとっていました。 C言語の場合でも、ファイルオープン→send関数,receive関数等を用いて送信・受信→ファイルクローズという形をとる事ができるのでしょうか?FTPプログラムやエコープログラムを、よく見かけるのですが・・・・

  • VB2005でバイト配列をコピーするには

    どなたかご教授下さい。 VB6で作成したプログラムをVB2005にコンバートしました。構造体からなる配列変数を一つの配列変数にコピー したいのですが、構造体の最初のメンバーだけ値が同じで以降の値は正しくセットされていませんでした。 どのように記述したらよいのでしょうか。またCopymMemory以外で良い方法があればご教授下さい。 よろしくお願い致します。 ===概略=== Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Byte, ByRef Source As Byte, ByVal Length As Short) 構造体定義 (コピー元) <StructLayout(LayoutKind.Sequential)>Structure ST_MOTO <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Dim byte_strTranCd() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=5)> Dim byte_strTanSeq() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Dim byte_strTxtNo() As Byte <MarshalAs(UnmanagedType.ByValArray, SizeConst:=3)> Dim byte_strTxtSeq() As Byte End Structure Dim A As ST_MOTO (コピー先) <StructLayout(LayoutKind.Sequential)> Structure ST_SAKI Dim lngrecLen As Integer 'データのLength <MarshalAs(UnmanagedType.ByValArray, SizeConst:=100)> Dim bytrecData() As Byte 'データ End Structure Dim B As ST_SAKI Call CopyMemory(B.bytrecData(0), A.byte_strTranCd(0), 14) 出力結果 '最初の構造体のメンバーの値は正しく設定されている B.bytrecData(0) =80    A.byte_strTranCd(0) =80 B.bytrecData(1) =50    A.byte_strTranCd(1) =50 B.bytrecData(2) =57    A.byte_strTranCd(2) =57 B.bytrecData(3) =50    A.byte_strTranCd(3) =50 'これ以降は正しくない。(VB6だと正しく設定されている) B.bytrecData(4) =0     A.byte_strTanSeq(0) =80 B.bytrecData(5) =0     A.byte_strTanSeq(1) =87 B.bytrecData(6) =0     A.byte_strTanSeq(2) =48 B.bytrecData(7) =0     A.byte_strTanSeq(3) =48 B.bytrecData(8) =6     A.byte_strTanSeq(4) =55     ・              ・     ・              ・

  • データ数の定まらないデータをもれなく配列変数に格納する方法

    あるときは10個またあるときは100個のデータがあるとします。 しかし、データの数は1000個になるかもしれませんし、1個になるかもしれません。 ただし、データ数が0個以下になることはありません。 このような、データ数の定まらないデータを確実にもれなく配列変数に代入したいのですが、方法がわかりません。 変数で dim hairetu(kazu) as integer として配列の数を設定できれば良いのですが、どうも無理のようです。 データの最大数(仮に1000個)を決めて dim hairetu(1000) as integer とするしかないのでしょうか。 何か良い方法はありませんでしょうか。

  • VB2005で、ファイル操作 VB6から触っていないので感覚がいまいち。

    VB2005で、ファイルを読み込み2行目から10行までを別ファイルに吐き出すコードがわからないのですが、 わかる方教えていただますか? 途中まではできたのですが、後がわかりません。 よろしくお願いいたします。 また、VB2005でわかりやすい書籍など紹介していただけましたら助かります。 'ファイルを開く Dim fs As New System.IO.FileStream(fileName, _ System.IO.FileMode.Open, System.IO.FileAccess.Read) 'ファイルを読み込むバイト型配列を作成する Dim bs(fs.Length - 1) As Byte 'ファイルの内容をすべて読み込む fs.Read(bs, 0, bs.Length) '閉じる fs.Close() ....[改行をLFとした場合に2行から10行目の内容を別のファイルに書き出すコード]